Sql-Server

使用聯接以更有效的方式編寫更新

  • June 24, 2019

如何以“更多 sql”的方式使用聯接編寫此更新?有人告訴我這是奇怪的編碼:

-- Updates recipient's account
   UPDATE table1
   SET balance = balance + @amount
   WHERE accountID = @recipientID
       AND -- check if a currency is the same in both accounts
       (
           SELECT t.CurrencyID
           FROM table1 t
           WHERE t.accountID = @payerID
           ) = (
           SELECT t.CurrencyID
           FROM table1
           WHERE t.accountID = @recipientID
           );

您可以在 CurrencyID 上使用 INNER JOIN 將 table1 重新連接到自身,但將要更新的表過濾為 accountID = @recipientID 的記錄,並且在 accountID = @payerID 的地方過濾連接的表

以這種方式,只有滿足兩個表的 WHERE 子句且同時匹配 CurrencyID 值的記錄才會包含在 UPDATE 中。

UPDATE t1
SET t1.balance = t1.balance + @amount
FROM table1 t1
INNER JOIN table1 t2 ON t1.CurrencyID = t2.CurrencyID
WHERE t1.accountID = @recipientID
   AND t2.accountID = @payerID

引用自:https://dba.stackexchange.com/questions/241230