215

これが私のMySQLデータベースでやりたいことです。

私はやりたい:

SELECT *
    FROM itemsOrdered
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID'
        AND status = 'PENDING'

それが を介して可能である行を返さない場合は、データベースにif(dr.HasRows == false)を作成します。UPDATEpurchaseOrder

UPDATE purchaseOrder
    SET purchaseOrder_status = 'COMPLETED'
    WHERE purchaseOrder_ID = '@purchaseOrder_ID'

このプロセスをもう少し短くするにはどうすればよいでしょうか?

4

9 に答える 9

489

特定のクエリに対して、次のことができます。

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
                     )
于 2012-12-21T14:23:30.693 に答える
62

複数テーブルUPDATE構文を使用して、 と のANTI-JOINpurchaseOrderを有効にすることができ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
于 2012-12-21T14:25:08.523 に答える
54

MySQL は をサポートしていないためif exists(*Your condition*) (*Write your query*)、次のように記述して「if 句」を実現できます。

(*Write your insert or update query*) where not exists (*Your condition*)
于 2012-12-21T15:00:39.823 に答える
16
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
于 2015-11-04T12:30:36.207 に答える
11

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.*;

このように、1 つのステートメントで挿入、更新、および削除できます。

詳細については、 https://technet.microsoft.com/en-us/library/bb522522 (v=sql.105).aspxの公式ドキュメントを参照して ください。

于 2016-12-08T06:42:33.487 に答える