是否对已排除的行进行了修改?

时间:2012-08-13 02:59:44

标签: sql sql-server sql-server-2008 merge

我有两张桌子:

表1

ID ColA ColB Status

表2

ColA ColB

我正试图将表2 中的MERGE条记录改为表1 ,其方式为:

  1. 对于表1 表2 中的每一行,我设置了Status = 1
  2. 对于表1中未显示的表2 中的每一行,我将该行插入表1 并设置Status = 1
  3. 对于表1 中的每一行表2 ,请设置Status = 0
  4. 是否有可能在一个声明中这样做?目前,我可以实现12,但我也不确定如何获得第三个:

    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的任何建议吗?

1 个答案:

答案 0 :(得分:1)

你想要"不匹配来源"子句。

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
;