如何在使用两个单独的更新的同时更新两个表?

时间:2016-02-09 14:32:25

标签: sql sql-server tsql sql-server-2008-r2

这是我的案例场景;我希望尽量减少我正在经历的步骤。具体来说,我正在使用子表的值更新主表,但是我正在更新子表以了解以前的更新。

无论如何,在我的情况下,我必须聚合两个表中常见的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(Rick):

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脚本?一旦@DowntimeTable更新,可能会自动更新AutoTable吗?

感谢。

1 个答案:

答案 0 :(得分: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