如下图所示,目的是删除红框中出现的行
可以使用关联子查询的方法来实现:
DELETE FROM deletetest t1 WHERE id <> ( SELECT MIN(t2.id) FROM deletetest t2 WHERE t1.name = t2.name AND t1.price = t2.price);
得到的结果:
原理:
通过关联子查询找出 name 和 price 都相同的行,取其中最小的 id,然后从原表中删除 id 不等于上述 id 的行。
苹果和香蕉没有重复行,而判断条件是不等号,所以不会被删除。而橘子有 3 行,其中最小的id是2,所以 id = 3 和 4 的行会被删除。
DELETE FROM 表名 AS t1 WHERE t1.唯一键 <> ( SELECT MIN( t2.唯一键 ) FROM 表名 AS t2 WHERE t1.列1 = t2.列1 AND t1.列2 = t2.列2);
如果想保留id最大的行,只需要把 MIN 改成 MAX 即可,如果需要去重的列只有一个或大于两个,则通过修改 AND 之后的部分即可实现同样的目标。