SQL 处理重复记录:查询、去重与删除实战指南
在数据库管理中,数据冗余和重复记录是常见痛点。本文将总结 SQL 中处理重复记录的核心技巧,涵盖从简单的结果去重到复杂的基于条件的记录删除,通过具体代码示例演示如何利用 Distinct、Group By 及子查询等机制,安全有效地清理 TestTable 中的重复数据。
查找重复记录
在处理数据之前,首先需要通过不同的查询方式定位重复的情况。根据需求不同,可以分为三种常见场景:
第1步:简单结果去重
目的:如果仅需在查询展示时隐藏重复行,不修改底层数据,可使用 DISTINCT 关键字。
操作:在 SELECT 语句中加入 DISTINCT。
select distinct * from TestTable
完成状态:查询返回的行中,所有字段的组合都是唯一的。
第2步:查询重复记录及其数量
目的:找出哪些数据是重复的,并统计每组重复数据的出现次数。
操作:使用 GROUP BY 对关键字段分组,配合 COUNT(*) 计数,并通过 HAVING 过滤出数量大于1的组。
select UserID,UserName,count(*) as '记录数'
from TestTable
Group by UserID,UserName
having count(*)>1
完成状态:列表仅显示存在重复情况的 UserID 和 UserName,以及它们各自的重复总数。
第3步:按条件保留单条重复记录
目的:当主键(如 UserID)不同,但业务字段(如姓名、性别、地址)完全一致时,可能需要提取其中一条作为代表。
操作:通过子查询找到每组重复记录中最大的 UserID,然后在外层查询中匹配这些 ID。
select * from TestTable where UserID in
(select max(UserID) as UserID from TestTable group by UserName,Sex,Place)
完成状态:结果集包含每组重复数据中具有最大 UserID 的那一行记录。
删除重复记录
确定重复模式后,可根据数据规模和业务需求选择清空重建或精确删除的策略。
第4步:全量表级去重(临时表法)
目的:快速清理整个表中所有的重复行,适用于对性能要求不高且允许短暂锁表的场景。
风险提示:此操作会彻底替换原表数据,执行前务必确认备份。
操作顺序:
- 创建临时表并导入去重后的数据:
select distinct * into #Temp from TestTable - 删除原始表数据:
drop table TestTable - 将临时表数据重新插入:
select * into TestTable from #Temp - 清理临时表:
drop table #Temp
完成状态:TestTable 中不再存在任何字段组合完全相同的重复行。
第5步:精确删除非保留记录
目的:在保留每组重复记录中某一条(通常是 ID 最大的一条)的情况下,删除其余重复项。
操作:利用 NOT IN 结合子查询,找出那些不在“各组最大 ID”集合中的记录进行删除。
delete TestTable where UserID not in
(select max(UserID) as UserID from TestTable group by UserName,Sex,Place)
完成状态:对于每一组由 UserName、Sex、Place 定义的重复数据,仅保留了 UserID 最大的那一条,其余全部被移除。
以上就是 SQL 处理重复记录的详细内容,更多关于数据库数据清洗优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









