SQL合并-仅在特定列已更新的地方插入

时间:2019-10-28 15:45:36

标签: sql sql-server-2012 sql-merge

我有一个如下所示的合并语句

...
WHEN NOT MATCHED BY TARGET then Insert
(ID,
Status, 
Read,
User,
ChangeDate)
VALUES
(Source.ID,
Source.Status,
Source.Read,
Source.User,
Source.ChangeDate)
...

我当前正在使用ID,Status和ChangeDate来将源与目标进行匹配。有时,ChangeDate可以更改,而无需对该行进行任何实际更改。我需要做的是让我的merge语句运行,并且如果Source.Status与基于ChangedDate的最新Target.Status不同,则仅插入新行。

我当前的目标表如下

ID    Status    Read    User    ChangeDate
33    Read       Yes     76     01-Jun-2019
33    Closed     Yes     76     12-Jun-2019
33    Read       Yes     76     23-Jun-2019

我的merge语句想将下面的行插入到该表中

ID    Status    Read    User    ChangeDate
33    Read       Yes     76     24-Jun-2019

我不希望发生这种情况,因为尽管ChangeDate已修改,但“状态”与上一行(2019年6月23日)相同

如果我的合并再次运行并尝试插入下面的行

ID    Status    Read    User    ChangeDate
33    Closed     Yes     76     30-Jun-2019

这将插入新行,因为“关闭”状态与先前的“读取”状态不同。

对此表示感谢,我想不出任何解决方法。

谢谢 杰西卡(Jessica)

试图合并在多个不同的列上

1 个答案:

答案 0 :(得分:0)

您不能使用ChangeDate字段来匹配源,因为您的合并总是插入的

关于更新,您可以这样做:

WHEN MATCHED AND (trg.example_column <> src.example_column 
   OR trg.example_column_2 <> src.example_column_2) THEN UPDATE
   SET 
   [VERSION] = tgt.ChangeDate = GETDATE()