Sql-Server

高效地執行多個相似的更新

  • May 5, 2019

我正在嘗試擴展一些現有的 SQL (SQL Server),這些 SQL (SQL Server) 建構了一個包含所有項目的表,以使用多個查詢進行操作。其中一些非常相似且成本高昂,我希望就如何組合它們或重新編寫本節來避免多次進行硬查詢獲得一些建議。我的 SQL 經驗有點淺,所以也許有一個明顯的解決方案。

--Move Messages if moveMessages=1
UPDATE t1
SET t1.foo = temp.newFoo,
   t1.bar = temp.newBar
FROM Table1 t1
INNER JOIN @TempTable TEMP ON TEMP.baz = t1.bar
                         AND TEMP.moveMessages = 1
INNER JOIN Table2 t2 ON t2.type = 'M'
                   AND t1.thingId = t2.thingId

--Move Documents if moveDocuments=1
UPDATE t1
SET t1.foo = TEMP.newFoo,
   t1.bar = TEMP.newBar
FROM Table1 t1
INNER JOIN @TempTable TEMP ON TEMP.baz = t1.bar
                         AND TEMP.moveDocuments = 1
INNER JOIN Table2 t2 ON t2.type = 'D'
                   AND t1.thingId = t2.thingId 

上面有更多的重複,但每一個之間的唯一區別是檢查了 TEMP 中的哪一列,以及 t2.type 引用了哪個字母。例如,對於 TEMP 中具有 moveMessages=1 的任何行,移動所有“M”類型。對於 TEMP 中具有 moveDocuments=1 的每一行,移動所有“D”類型,依此類推。

有沒有辦法在一個聲明中完成所有這些?這是我應該使用另一個臨時表的情況嗎?

語法的好處之一INNER JOIN是它實際上允許您將過濾條件與連接條件分開。您問題中的兩個語句可以折疊成一個查詢,如下所示:

UPDATE t1
SET t1.foo = temp.newFoo,
   t1.bar = temp.newBar
FROM dbo.Table1 t1 -- please always use schema qualifiers
INNER JOIN @TempTable TEMP 
 ON TEMP.baz = t1.bar
INNER JOIN dbo.Table2 t2 
 ON t1.thingId = t2.thingId
WHERE (TEMP.moveMessages  = 1 AND t2.type = 'M')
  OR (TEMP.moveDocuments = 1 AND t2.type = 'D');

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