You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用查询结果完全替换目标表行?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:05:02