Sql server 2008 使用SQL Server中的合并更新第三个表
我有两个表A和B。表A是源,B是目标。根据某些条件,我将从A更新B中的现有行(仅选择性列),或者从A插入B中的新行。A和B具有相同的列。我可以使用MERGE来实现这一点 现在,如果表B中的行被更新,我需要更新第三个表C中的一些记录。是否可以在下面的语句中这样做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
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)
,以最合适的为准。大概是这样的: