查询所有emp_no重复的emp_no

    SELECT emp_no
    FROM titles_test
    GROUP BY emp_no
    HAVING COUNT(*) > 1;

删除重复emp_no除了最小id

痛点https://blog.csdn.net/zj20142213/article/details/81073428

根据emp_no分组,查找出id最小的。然后再查找id不包含刚才查出来的minId。这样就查询出了所有的重复数据(除了deptno最小的那行)

通过GROUP BY筛查的表中间会生成生成一张“虚拟表”(详情上方链接),通过MIN()函数后就可以同意解决重复和不重复emp_no最小id的问题

DELETE FROM titles_test
WHERE id NOT IN(
    SELECT temp.minId FROM
    (
        SELECT MIN(id) AS minId
        FROM titles_test
        GROUP BY emp_no
    ) AS temp
);

优化进阶版: 首先拷贝一份原表简称t2,原表称为t1,两张表开始比较,只要emp_no相等我们就取id其最小值(类似冒泡),最终我们会获得每一个emp_no对应的最小的id,最后删除不含这些minId的数据就可以获得结果。

DELETE FROM
    titles_test AS t1 
WHERE
	t1.id NOT IN 
    (
        SELECT t3.minId 
        FROM (
            SELECT MIN( t2.id ) AS minId  
            FROM titles_test AS t2 
            WHERE t1.emp_no = t2.emp_no 
        ) AS t3 
	);

模板提炼: 删除重复记录,保留最小/最大:

DELETE FROM
    表名 AS t1 
WHERE
    t1.唯一键 NOT IN 
    (
        SELECT t3.min/max唯一键 
        FROM (
            SELECT MIN/MAX( t2.唯一键 ) AS min/max唯一键  
            FROM 表名 AS t2 
            WHERE t1.重复键 = t2.重复键 
        ) AS t3 
    );