2
這是我的案例場景;我期望儘量減少我所經歷的步驟數量。具體來說,我使用子表的值更新主表,但是我正在更新子表以知道以前的更新是哪一個。如何在使用兩個單獨更新的同時更新兩個表?
無論如何,在我的情況下,我必須彙總這兩個表中常見的SalesId,然後對所有的值進行排序。
AutoTable:
SalesId Value
Joe 10
Rick 5
Jean 8
Bob 19
Julian 12
ManualTable:
SalesId Value WasUpdated
Vick 18
Rick 20
Mary 15
July 11
我需要訂購全部來自這兩個表的銷售。還有一個SalesId
(裏克),這兩個表中:
Sales Total Auto Manual
Rick 25 5 20
Bob 19 19 0
Vick 18 0 18
Mary 15 0 15
Julian 12 12 0
July 11 0 11
Joe 10 10 0
Jean 8 8 0
爲了得到這樣的結果,我打算用下面的邏輯。正如你所看到的,步驟3 & 4有點重複;在我的情況下,我正在爲Rick的情況更新@DowntimeTable,但隨後我正在更新ManualTable,以便我知道我已經處理了Rick,並且不需要插入(步驟5)。
某些腳本可能無法正常運行。問題的目的是消除步驟。
-- Create @DowntimeTable table
declare @DowntimeTable table (Sales varchar(20), Auto int, Manual int, Total int)
-- Add AutoTable to @DowntimeTable
INSERT INTO @DowntimeTable (Sales, Auto) Select sales, auto from AutoTable
-- Update @DowntimeTable.Manual with matching ManualTable.Sales (ie Rick)
Update @DowntimeTable set Manual = ManualTable.Value
from ManualTable inner join @DowntimeTable td on
ManualTable.Sales = @DowntimeTable.sales
-- Set ManualTable.WasUpdate true for rows updated in previous UPDATE (ie Rick)
Update ManualTable
set WasUpdated = 1 from ManualTable inner join @DowntimeTable on
ManualTable.Sales = @DowntimeTable.sales
-- Insert rest of ManualTable
INSERT INTO @DowntimeTable (Sales, Manual)
Select sales, Manual from ManualTable where WasUpdated = 0
UPDATE @DowntimeTable set Total = Manual + Auto
所以,我的問題是:是否有可能組步驟3 & 4成一個SQL腳本?也許自動更新AutoTable一旦@DowntimeTable更新?
謝謝。
注意:將列添加到TABLE ALTERs它..您正在更改表的結構。所以,不,你不能同時做#3和#4。我建議先做#4,然後再做#3,如果可能的話。 – Leptonator
你的問題非常含糊,但我感覺你在這裏使用循環做你的更新? –
我已更新該問題。我不使用循環。如果我要運行它,它將完全發佈,明顯修復任何不正確的sql語法(即。表變量別名)。 – rbhat