使用合并时删除某些行

Posted

技术标签:

【中文标题】使用合并时删除某些行【英文标题】: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;

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于使用合并时删除某些行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 UPDATE 合并和删除 SQL 中的重复行?

使用熊猫合并tsv文件的问题

使用 jquery 选择要删除的某些 html 代码

Python 3 - 合并 .xls/删除行/删除重复项

Word宏用于仅从某些表格单元格中删除颜色

Oracle SQL 选择具有开始和结束日期的行,如果某些重叠合并行