SQL两表关联时删除dbo表与stage表匹配重复记录的方法
需求说明
需要完成两个表的去重+导入操作,规则如下:
- 关联
stage、dbo两张表,排查两表中业务字段匹配的重复记录 - 匹配到的重复记录从
dbo表中删除 - 去重完成后,将
stage表全量数据导入dbo表
示例数据参考
stage表初始数据
market cost ra file_id CA 32 2 200 CA 44 5 200 TX 22 2 200
dbo表初始数据
market cost ra file_id CA 72 9 100 CA 44 5 100 TX 22 2 100
去重后dbo表预期保留数据
market cost ra file_id CA 72 9 100
原有查询语句问题
之前写的重复识别语句存在语法和逻辑问题,无法实现删除效果,原语句如下:
select s.market, s.cost,s.ra , s.[file_id] ,count(*) from stage table s join dbo table d on s.market=d.market and s.cost=d.cost, s.ra=d.ra group by s.market, s.cost,s.ra , s.[file_id] having count(*) > 1;
具体问题点:
- 表别名写法错误,给表定义别名不需要额外加
table关键字,正确写法是stage s、dbo d - JOIN关联条件语法错误,多个匹配字段之间要用
AND连接,不能用逗号分隔 - 仅做了重复值聚合查询,没有定位到dbo表中需要删除的具体行,无法支撑删除操作
正确实现SQL
步骤1:删除dbo表中与stage表匹配的重复记录
重复判定规则:market、cost、ra三个业务字段值完全一致即判定为重复,删除语句如下:
DELETE d FROM dbo d INNER JOIN stage s ON d.market = s.market AND d.cost = s.cost AND d.ra = s.ra;
安全提示:执行删除前可以把
DELETE d替换为SELECT d.*先运行,预览待删除的记录是否符合预期,确认无误后再执行删除操作,避免误删。
用样例数据执行该语句后,dbo表中CA 44 5 100、TX 22 2 100两条和stage表字段匹配的记录会被删除,仅保留CA 72 9 100,完全符合预期结果。
步骤2:将stage表全量数据导入dbo表
删除完成后执行插入语句,把stage的全量数据写入dbo即可:
INSERT INTO dbo (market, cost, ra, file_id) SELECT market, cost, ra, file_id FROM stage;
执行完成后dbo表会包含原有保留的1条非重复记录+stage导入的3条记录,无重复冲突。
内容的提问来源于stack exchange,提问作者user15132810
相关产品推荐
相关产品推荐

