Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用两个单独的更新同时更新两个表?_Sql_Sql Server_Tsql_Sql Server 2008 R2 - Fatal编程技术网

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

Sql 如何使用两个单独的更新同时更新两个表?,sql,sql-server,tsql,sql-server-2008-r2,Sql,Sql Server,Tsql,Sql Server 2008 R2,以下是我的案例场景;我希望尽量减少我正在经历的步骤。具体地说,我正在用子表的值更新主表,但随后我正在更新子表,以了解以前的更新是哪些 无论如何,在我的例子中,我必须聚合两个表中通用的SalesId,然后对所有值进行排序 自动表格: SalesId Value Joe 10 Rick 5 Jean 8 Bob 19 Julian 12 SalesId Value WasUpdated Vick

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

无论如何,在我的例子中,我必须聚合两个表中通用的SalesId,然后对所有值进行排序

自动表格

SalesId     Value
Joe         10
Rick        5
Jean        8
Bob         19
Julian      12
SalesId     Value     WasUpdated
Vick        18
Rick        20
Mary        15
July        11
手册表格

SalesId     Value
Joe         10
Rick        5
Jean        8
Bob         19
Julian      12
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的案例更新@downthedule,但随后我正在更新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脚本中?更新@downthedule后是否可以自动更新自动表


谢谢。

这不是一个很明确的提问方式。。。只需发布代码并添加注释,而不是代码注释

我知道我没有更新任何东西,但一开始看起来你只是想做一些更新来输出这样的东西

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

注意:向表中添加列会改变它。。您正在更改表的构造。所以,不,你不能同时做3和4。如果可能的话,我建议你先做4,然后再做3。你的问题非常模糊,但我感觉你在使用循环来进行更新?我已经更新了问题。我不使用循环。如果我运行它,它将与发布的完全一样,显然修复了任何不正确的sql语法(即表变量别名)。