查询所有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
);