Sql server 在T-SQL合并中在目标表中的字段之间移动数据
我有一个SQL MERGE语句,如果存在值,它将执行更新(如果存在,则执行INSERT)。我想在更新发生时记录行中最后几个“历史”值,有点像这样:Sql server 在T-SQL合并中在目标表中的字段之间移动数据,sql-server,tsql,sql-server-2008,merge,sql-update,Sql Server,Tsql,Sql Server 2008,Merge,Sql Update,我有一个SQL MERGE语句,如果存在值,它将执行更新(如果存在,则执行INSERT)。我想在更新发生时记录行中最后几个“历史”值,有点像这样: MERGE into desttable as dest USING sourcetable as src on src.ref = dest.ref WHEN MATCHED THEN UPDATE SET dest.oldvalue3=dest.oldvalue2, dest.oldvalue2=dest.oldvalue1, dest.o
MERGE into desttable as dest
USING sourcetable as src
on src.ref = dest.ref
WHEN MATCHED THEN
UPDATE SET dest.oldvalue3=dest.oldvalue2,
dest.oldvalue2=dest.oldvalue1,
dest.oldvalue1=dest.value,
dest.value=src.newvalue
WHEN NOT MATCHED THEN
INSERT ...
。。。因此,从本质上讲,现有的“value”被洗牌到“oldvalue1”,“oldvalue1”变成“oldvalue2”等等。然而,当我运行它时,每一列都被设置为“value”-UPDATE语句显然是一次设置所有字段。有什么方法可以实现我想要做的吗?您可以在
using
子句中左外连接desttable
,并使用desttable
中的列作为更新的源
MERGE INTO desttable AS dest
USING (SELECT s.ref,
s.newvalue,
d.oldvalue2,
d.oldvalue1,
d.value
FROM sourcetable AS s
LEFT OUTER JOIN desttable AS d
ON s.ref = d.ref) AS src
ON src.ref = dest.ref
WHEN MATCHED THEN
UPDATE SET dest.oldvalue3=src.oldvalue2,
dest.oldvalue2=src.oldvalue1,
dest.oldvalue1=src.value,
dest.value=src.newvalue
;