MySQL 8+无唯一ID表:能否用单条SQL语句删除重复记录?
在MySQL 8+中用单条SQL删除无唯一ID表的重复记录
当然可以实现,借助MySQL 8.0引入的窗口函数,只用单条SQL就能完成无唯一ID表的重复记录删除。针对你提供的employee表,我们可以用ROW_NUMBER()窗口函数给重复分组内的行编号,然后删除编号大于1的重复行。
具体SQL语句
DELETE e1 FROM employee e1 JOIN ( SELECT employee_name, age, ROW_NUMBER() OVER (PARTITION BY employee_name, age ORDER BY (SELECT NULL)) AS row_num FROM employee ) e2 ON e1.employee_name = e2.employee_name AND e1.age = e2.age WHERE e2.row_num > 1;
逻辑说明
PARTITION BY employee_name, age:将表中数据按employee_name和age分组,把重复的记录归为同一组。ROW_NUMBER() OVER (...):给每个分组内的行分配递增编号,每组第一行编号为1,后续重复行编号依次为2、3...- 通过JOIN关联原表和子查询结果,删除所有编号大于1的行,只保留每组的第一条记录。
注意事项
ORDER BY (SELECT NULL)是因为窗口函数必须指定ORDER BY子句,这里不需要特定排序顺序,用它可以让MySQL随机保留分组内的任意一行。如果后续表中添加了时间类字段(比如create_time),可以替换为ORDER BY create_time DESC保留最新记录,或者ASC保留最早记录。
内容的提问来源于stack exchange,提问作者Farazinux
相关产品推荐
相关产品推荐

