处理重复记录需先明确重复定义,通常基于字段组合。使用GROUP BY与HAVING可快速识别重复项,如SELECT email, COUNT() FROM users GROUP BY email HAVING COUNT() > 1;结合子查询可关联原表获取完整信息。窗口函数ROW_NUMBER()提供更灵活去重方式,通过分组排序标记行序,如WITH ranked AS (SELECT , ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY id) as rn) SELECT FROM ranked WHERE rn = 1,可精准保留指定记录。删除重复数据时可用自连接或临时表,如DELETE u1 FROM users u1, users u2 WHERE u1.id > u2.id AND u1.email = u2.email,保留较小ID。操作前必须备份数据,避免误删。核心是依据业务逻辑选择策略:GROUP BY适合分析重复情况,窗口函数适合复杂保留规则,删除操作应谨慎执行。

处理重复记录是 SQL 复杂查询中的常见问题。核心思路是识别重复数据,并根据业务需求决定保留或剔除。关键在于明确“什么是重复”——通常指某些字段组合完全相同,而非整行。
使用 GROUP BY 和 HAVING 筛选重复项
通过分组统计数量,找出出现多次的记录组合。
例如,想找出表中 email 字段重复的所有记录:- SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) > 1;
利用窗口函数精准定位重复行
ROW_NUMBER() 可为每组内的行编号,便于标记哪些是重复的。
- WITH ranked AS (
- SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY id) as rn
- FROM users
- )
- SELECT * FROM ranked WHERE rn = 1;
删除物理重复数据的方法
在确认后可执行删除操作,但务必先备份。
借助临时标识或自连接删除冗余行:- DELETE u1 FROM users u1, users u2
- WHERE u1.id > u2.id AND u1.email = u2.email;
基本上就这些。关键是理解数据结构和业务逻辑,选择合适策略。用窗口函数最灵活,GROUP BY 查看重复情况最快,删除操作要谨慎。










