Sql-Server
高效地執行多個相似的更新
我正在嘗試擴展一些現有的 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');