【问题标题】:delete certain rows when using merge使用合并时删除某些行
【发布时间】:2021-03-23 16:22:43
【问题描述】:

我最近遇到了非常方便的合并语句,但我不确定如何删除某些记录。

在我的示例中,假设我当前的表有以下记录。然后我需要重新导入账户 ABC 的数据。在我的合并语句中,我在匹配时进行更新,然后在与目标不匹配时插入数据。这工作正常。我无法解决的是如何删除数据。下面的第二个表显示了我要重新导入的数据,因此我希望我的删除查询忽略日期不为 2021-03-01 且帐户不等于 ABC 的任何行。 IE。只删除账号为ABC,日期为2021-03-01,id为AM74的行,可以吗?

date         account    id     value
2021-03-01   ABC        AM74   0.345
2021-03-01   ABC        AM91   0.354
2021-03-01   ABC        AC32   0.276
2021-03-01   ABC        AD12   0.445
2021-03-01   DEF        AC32   0.276
2021-03-01   DEF        AD12   0.445

**data to be re-imported**

date         account    id     value    
2021-03-01   ABC        AM91   0.354
2021-03-01   ABC        AC32   0.276
2021-03-01   ABC        AD12   0.445

**end result**


date         account    id     value
2021-03-01   ABC        AM91   0.354
2021-03-01   ABC        AC32   0.276
2021-03-01   ABC        AD12   0.445
2021-03-01   DEF        AC32   0.276
2021-03-01   DEF        AD12   0.445

因此帐户 ABC 和 ID AM74 的行已被删除

MERGE account_val t
USING #data s
ON t.date = #s.date and
t.account = #s.account and
t.id = #s.id
WHEN MATCHED
UPDATE t.value = s.value
WHEN NOT MATCHED BY TARGET THEN
INSERT(date, account, id, value)
VALUES(#s.date, #s.account, #s.id, #s.value)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您可以使用公用表表达式来选择 account='ABC' 的行来执行、插入、更新和删除。

    with cte as 
    (
        select * from account_val where ACCOUNT='ABC'
    )
    MERGE cte t
    USING #data s
    ON t.date = #s.date and
    t.account = #s.account and
    t.id = #s.id
    WHEN MATCHED
    UPDATE t.value = s.value
    WHEN NOT MATCHED BY TARGET THEN
    INSERT(date, account, id, value)
    VALUES(#s.date, #s.account, #s.id, #s.value)
    WHEN NOT MATCHED BY SOURCE THEN
    DELETE;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 2012-06-08
      相关资源
      最近更新 更多