使用合并时删除某些行
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;
【讨论】:
以上是关于使用合并时删除某些行的主要内容,如果未能解决你的问题,请参考以下文章