1

我有两张桌子:

表 1

ID ColA ColB Status

表 2

ColA ColB

我正在尝试以以下方式将表 2MERGE中的记录记录到表 1中:

  1. 对于表 1中的表 2中的每一行,我设置Status = 1
  2. 对于表 2中不存在于表 1 中的每一行,我将该行插入到表 1中并设置Status = 1
  3. 对于表 1中不存在于表 2中的每一行,设置Status = 0

是否有可能在一个声明中做到这一点?1目前,我能够实现2但不确定如何获得第三个:

MERGE INTO dbo.Table1 WITH(HOLDLOCK) AS Target
USING dbo.Table2 AS Source
ON Target.ColA = Source.ColA AND Target.ColB = Source.ColB
WHEN MATCHED THEN
    UPDATE SET Target.Status = 1
WHEN NOT MATCHED THEN
    INSERT (ColA, ColB, Status) VALUES(Source.ColA, Source.ColB, 1);

关于如何3在同一声明中实现的任何建议?

4

1 回答 1

1

您想要“NOT MATCHED BY SOURCE”子句。

MERGE INTO dbo.Table1 WITH(HOLDLOCK) AS Target
USING dbo.Table2 AS Source
ON Target.ColA = Source.ColA AND Target.ColB = Source.ColB
WHEN MATCHED THEN
    UPDATE SET Status = 1
WHEN NOT MATCHED THEN
    INSERT (ColA, ColB, Status) VALUES(Source.ColA, Source.ColB, 1)
WHEN NOT MATCHED BY SOURCE THEN
    UPDATE SET Status = 0
;
于 2012-08-13T03:09:27.420 回答