SQL删除一组记录中除ID最小的以外的所有记录

时间:2024-03-31 11:13:29

最近在业务系统中出现了bug,一部分用户的某种数据出现了多条重复,为了洗掉重复的数据,只保留第一次出现的数据,就有了标题中的需求。

假设现在系统中表test_copy1结构及数据如图所示:

SQL删除一组记录中除ID最小的以外的所有记录

那么要删除的就是id=999 id=1012、1013、1014和id=1015的数据

首先要选出要删除的记录,需要用到聚合函数和HAVING字句

SELECT id FROM test_copy1 WHERE id NOT IN ( SELECT min( id ) AS id FROM test_copy1 GROUP BY `name` HAVING min( id ) );

接下来就是删除这些数据,如果直接写如下的SQL会报出异常1093-You can’t specify target table for update in FROM clause

参考文章:http://blog.csdn.net/chenhao0568/article/details/60133094

最终SQL如下:

DELETE 
FROM
test_copy1 
WHERE id IN ( SELECT
id 
FROM ((SELECT * FROM test_copy1) temp)
WHERE id NOT IN ( 

SELECT min( id ) AS id 

FROM ((SELECT * FROM test_copy1) temp1) 

GROUP BY `name` 

HAVING min( id )));