2016-02-09 120 views
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更新?

謝謝。

+0

注意:將列添加到TABLE ALTERs它..您正在更改表的結構。所以,不,你不能同時做#3和#4。我建議先做#4,然後再做#3,如果可能的話。 – Leptonator

+0

你的問題非常含糊,但我感覺你在這裏使用循環做你的更新? –

+0

我已更新該問題。我不使用循環。如果我要運行它,它將完全發佈,明顯修復任何不正確的sql語法(即。表變量別名)。 – rbhat

回答

1

這不是一個非常明確的方式來問...只是發佈代碼並添加評論而不是代碼評論。

我知道我沒有更新任何東西,但起初它看起來像你試圖做更新只輸出這樣的東西?

select 
    ISNULL(AT.SalesId,MT.SalesId) [Sales], 
    ISNULL(AT.Value,0)+ISNULL(MT.Value,0) [Total], 
    ISNULL(AT.Value,0) [Auto], 
    ISNULL(MT.Value,0) [Manual] 
from AutoTable AT 
full outer join ManualTable MT ON 
    AT.SalesId = MT.SalesId