如何在SQL中删除两列相似、一列不同的重复记录?
解决SQL中删除两列重复、一列不同的重复记录问题
嘿,我来帮你搞定这个需求!看起来你想要保留每个Name和Family组合下ID最小的那条记录,删掉其他重复的(也就是记录3和4,它们和记录1的Name、Family一致,但ID更大或者Phone_Number不同)。下面给你两种通用的解决方案,适配不同的SQL数据库版本:
方法1:使用窗口函数(适用于SQL Server、PostgreSQL、MySQL 8.0+等)
这种方法逻辑清晰,容易理解,先给每条记录按Name+Family分组并排序,标记出需要保留的第一条记录,再删除其他的:
-- 先通过CTE给每条记录标记排序序号 WITH ranked_records AS ( SELECT ID, -- 按Name和Family分组,每组内按ID升序排序,第一条的序号为1 ROW_NUMBER() OVER (PARTITION BY Name, Family ORDER BY ID ASC) AS rn FROM your_table_name -- 替换成你的实际表名 ) -- 删除序号大于1的记录(也就是每组中除了第一条之外的重复项) DELETE FROM your_table_name WHERE ID IN (SELECT ID FROM ranked_records WHERE rn > 1);
方法2:使用自连接(适用于MySQL 5.x等不支持窗口函数的版本)
如果你的数据库版本比较旧,不支持窗口函数,可以用自连接的方式来定位要删除的记录:
DELETE t1 FROM your_table_name t1 JOIN your_table_name t2 ON t1.Name = t2.Name AND t1.Family = t2.Family AND t1.ID > t2.ID; -- 保留ID更小的那条,删除更大的
重要提示
在执行删除操作前,一定要先验证要删除的记录是否正确!可以把DELETE换成SELECT,先查看要删除的内容:
比如对于方法1,先运行:
WITH ranked_records AS ( SELECT ID, ROW_NUMBER() OVER (PARTITION BY Name, Family ORDER BY ID ASC) AS rn FROM your_table_name ) SELECT * FROM your_table_name WHERE ID IN (SELECT ID FROM ranked_records WHERE rn > 1);
确认返回的是记录3和4之后,再执行删除操作,避免误删数据。
内容的提问来源于stack exchange,提问作者Shahrooz_274
相关产品推荐
相关产品推荐

