Как поместить предложение "if" в строку SQL?
Итак, вот что я хочу сделать в моей базе данных MySQL.
Я хотел бы сделать:
SELECT *
FROM itemsOrdered
WHERE purchaseOrder_ID = '@purchaseOrdered_ID'
AND status = 'PENDING'
Если это не вернет никаких строк, что возможно через if(dr.HasRows == false)
, я бы сейчас создал UPDATE
в базе данных purchaseOrder
:
UPDATE purchaseOrder
SET purchaseOrder_status = 'COMPLETED'
WHERE purchaseOrder_ID = '@purchaseOrder_ID'
Как бы я мог сделать этот процесс немного короче?
Ответы
Ответ 1
Для вашего конкретного запроса вы можете:
UPDATE purchaseOrder
SET purchaseOrder_status = 'COMPLETED'
WHERE purchaseOrder_ID = '@purchaseOrder_ID' and
not exists (SELECT *
FROM itemsOrdered WHERE purchaseOrder_ID = '@purchaseOrdered_ID' AND status = 'PENDING'
)
Однако, я мог бы предположить, что вы зацикливаетесь на более высоком уровне. Чтобы установить все такие значения, попробуйте следующее:
UPDATE purchaseOrder
SET purchaseOrder_status = 'COMPLETED'
WHERE not exists (SELECT 1
FROM itemsOrdered
WHERE itemsOrdered.purchaseOrder_ID = purchaseOrder.purchaseOrdered_ID AND
status = 'PENDING'
limit 1
)
Ответ 2
Синтаксис с несколькими таблицами UPDATE
можно использовать для ANTI-JOIN
между purchaseOrder
и itemsOrdered
:
UPDATE purchaseOrder p LEFT JOIN itemsOrdered i
ON p.purchaseOrder_ID = i.purchaseOrder_ID
AND i.status = 'PENDING'
SET p.purchaseOrder_status = 'COMPLETED'
WHERE p.purchaseOrder_ID = '@purchaseOrder_ID'
AND i.purchaseOrder_ID IS NULL
Ответ 3
Так как MySQL не поддерживает if exists(*Your condition*) (*Write your query*)
, вы можете создать предложение if, написав вот так:
(*Write your insert or update query*) where not exists (*Your condition*)
Ответ 4
Вы также можете использовать следующий запрос, чтобы проверить, существует ли запись, а затем обновить ее:
if not exists(select top 1 fromFROM itemsOrdered
WHERE purchaseOrder_ID = '@purchaseOrdered_ID'
AND status = 'PENDING' )
Begin
UPDATE purchaseOrder
SET purchaseOrder_status = 'COMPLETED'
WHERE purchaseOrder_ID = '@purchaseOrder_ID
End
Ответ 5
Select FROM t1
WHERE s11 > ANY
(SELECT col1,col2 FROM t2
WHERE NOT EXISTS
(SELECT * FROM t3
WHERE ROW(5*t2.s1,77)=
(SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM
(SELECT * FROM t5) AS t5)));
Ответ 6
if not exists(select top 1 fromFROM itemsOrdered
WHERE purchaseOrder_ID = '@purchaseOrdered_ID'
AND status = 'PENDING' )
Begin
UPDATE purchaseOrder
SET purchaseOrder_status = 'COMPLETED'
WHERE purchaseOrder_ID = '@purchaseOrder_ID
End
Ответ 7
после SQL Server 2008 обеспечить Merge
для вставки, обновления и удаления операции на основе одного оператора сопоставления, что также позволяет присоединиться. Пример ниже может помочь вам.
MERGE Target AS T
USING Source AS S
ON (T.EmployeeID = S.EmployeeID)
WHEN NOT MATCHED BY TARGET AND S.EmployeeName LIKE 'S%'
THEN INSERT(EmployeeID, EmployeeName) VALUES(S.EmployeeID, S.EmployeeName)
WHEN MATCHED
THEN UPDATE SET T.EmployeeName = S.EmployeeName
WHEN NOT MATCHED BY SOURCE AND T.EmployeeName LIKE 'S%'
THEN DELETE
OUTPUT $action, inserted.*, deleted.*;
Как это вы можете вставлять, обновлять и удалять в одном утверждении.
и для получения дополнительной информации вы можете обратиться к официальным документам на https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx
Ответ 8
Если таблица содержит миллионы записей, следующий запрос будет работать быстро.
UPDATE PO
SET PO.purchaseOrder_status = 'COMPLETED'
FROM purchaseOrder PO
LEFT OUTER JOIN itemsOrdered IOD ON IOD.purchaseOrder_ID = PO.purchaseOrdered_ID and IOD.status = 'PENDING'
WHERE IOD.purchaseOrder_ID IS NULL