如何用查询结果完全替换目标表行?Merge语句无法删除多余行
用MERGE实现源数据完全替换目标表行数据
你当前的MERGE语句只处理了匹配行更新和源有目标无的行插入,但遗漏了目标有源无的行删除,这就是目标表多余行无法被清理的原因。
要实现完全替换,只需在MERGE语句中添加WHEN NOT MATCHED BY SOURCE THEN DELETE分支,完整语句如下:
merge into #table1 as dest using ( select ... col1 -- 这里是你的源数据查询语句 ) as src on dest.col1 = src.col1 when matched then update set dest.col1 = src.col1 -- 如果有其他字段,可在此一并更新对应值 when not matched by target then insert (col1) values (src.col1) when not matched by source then delete;
各分支作用说明
WHEN MATCHED:当目标表与源表通过col1匹配时,更新目标表对应字段(若仅col1作为匹配键,此更新无实际数据变化,但保留分支可兼容后续新增字段的场景)WHEN NOT MATCHED BY TARGET:源表存在但目标表没有的行,插入到目标表中WHEN NOT MATCHED BY SOURCE:目标表存在但源表没有的行,从目标表中删除
执行上述语句后,目标表#table1的行将与源数据集合完全一致:源表多的行会被插入,源表少的行会被删除,匹配的行会被更新(若字段有变化)。
比如你提到的场景:目标表原有2行,源表仅1行,执行后目标表中不在源表的那1行会被删除,最终只保留与源表一致的1行。
内容的提问来源于stack exchange,提问作者Semyon-coder
相关产品推荐
相关产品推荐

