Как поместить предложение "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