Sql server 2008 使用SQL Server中的合并更新第三个表

Sql server 2008 使用SQL Server中的合并更新第三个表,sql-server-2008,Sql Server 2008,我有两个表A和B。表A是源,B是目标。根据某些条件,我将从A更新B中的现有行(仅选择性列),或者从A插入B中的新行。A和B具有相同的列。我可以使用MERGE来实现这一点 现在,如果表B中的行被更新,我需要更新第三个表C中的一些记录。是否可以在下面的语句中这样做 MERGE B USING A ON A.somecolumn = B.somecolumn WHEN MATCHED THEN UPDATE SET B.somecolumn1 = A.somecolumn1, B.somecol

我有两个表A和B。表A是源,B是目标。根据某些条件,我将从A更新B中的现有行(仅选择性列),或者从A插入B中的新行。A和B具有相同的列。我可以使用MERGE来实现这一点

现在,如果表B中的行被更新,我需要更新第三个表C中的一些记录。是否可以在下面的语句中这样做

MERGE B
USING A
ON A.somecolumn = B.somecolumn

WHEN MATCHED THEN

UPDATE 
SET
B.somecolumn1 = A.somecolumn1,
B.somecolumn2 = A.somecolumn2

WHEN NOT MATCHED BY TARGET THEN
INSERT INTO B
somecolumn1, 
somecolumn2, 
somecolumn3,
somecolumn4 

VALUES
(
A.somecolumn1, 
A.somecolumn2, 
A.somecolumn3,
A.somecolumn4 
);
此Microsoft演示了在查询结束时使用
OUTPUT$action…
填充临时表的示例。这是您必须使用的方法


我以前的想法是,在第三个表上使用
MERGE
语句作为
UPDATE
的子查询,但这种想法行不通。我可以更新我的答案以使用临时表/变量,但是来自的答案(和示例)已经为您提供了一个干净的解决方案,我的答案将在我完成时模拟这个解决方案。

您需要使用临时表/表变量的merge语句和update语句的临时存储

-- Your table A, B and C
declare @A table(ID int, Col int)
declare @B table(ID int, Col int)
declare @C table(ID int, Col int)

-- Sample data
insert into @A values (1, 1),(2, 2)
insert into @B values (1, 0)
insert into @C values (1, 0),(2, 0)

-- Table var to store ouput from merge
declare @T table(ID int, Col int, Act varchar(10))

-- Merge A -> B
merge @B as B
using @A as A
on A.ID = B.ID
when not matched then insert (ID, Col) values(A.ID, A.Col)
when matched then update set Col = A.Col
output inserted.ID, inserted.Col, $action into @T;

-- Update C with rows that where updated by merge    
update C set
  Col = T.Col
from @C as C
  inner join @T as T
    on C.ID = T.ID and
       T.Act = 'UPDATE'

我尝试在更新中使用
merge
的输出,结果得到了。“UPDATE或DELETE语句的FROM子句中不允许使用嵌套的INSERT、UPDATE、DELETE或MERGE语句。”因此,我认为使用
UPDATE
@MikaelEriksson不可能做到这一点。我的研究同意你的看法,没有temp table/table变量,你似乎无法做到这一点。再次感谢。插入到@A值(1,1)、(2,2)、(2,1)插入到@B值(1,0)使用此输入,我得到的结果@B为(1,1)、(2,2)和(2,1),但我希望它是(1,1)、(2,1),因为@A的第三个数据集只是@A的第二个数据集的更新。有没有办法使合并代码的行为与我预期的一样(Mikael和Adam)?插入到@A值(1,1)、(2,2)、(2,1)插入到@B值(1,0)使用此输入,我得到的结果@B为(1,1)、(2,2)和(2,1),但我希望它是(1,1)、(2,1),因为@A的第三个数据集只是@A的第二个数据集的更新。有没有办法使合并代码的行为与我预期的一样(Mikael和Adam)?@user1072578-不,这不是合并的工作方式。它将在修改任何内容之前找出哪些行是匹配的,哪些行是不匹配的。您可以做的是在using子句中按on ID分组,并获得
max(col)
min(col)
,以最合适的为准。大概是这样的: