【问题标题】:Upsert with modifications to excluded rows?Upsert 修改排除的行?
【发布时间】:2012-08-13 02:59:43
【问题描述】:

我有两张桌子:

表 1

ID ColA ColB Status

表 2

ColA ColB

我正在尝试将 表 2 中的 MERGE 记录转换为 表 1,其方式如下:

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

是否可以在一个语句中做到这一点?目前,我能够实现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 有什么建议吗?

【问题讨论】:

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


    【解决方案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
    ;
    

    【讨论】:

    • 一时间,我以为NOT MATCHED BY SOURCE 中的SOURCESource 的别名!以防万一,其他任何人都会面临 - NOT MATCHED BY SOURCE 是一个内置表达式。
    猜你喜欢
    • 2013-07-08
    • 2011-02-24
    • 1970-01-01
    • 2018-08-08
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多