我有这个表结构:
+----+-------+
| ID | phone |
+----+-------+
| 3 | 000 |
| 4 | 111 |
| 5 | 111 |
| 8 | 222 |
| 9 | 333 |
+----+-------+
我知道,我可以用这个sql显示重复的行:
SELECT * FROM TablePhones GROUP BY phone having count(*) > 1
但是我需要一个sql命令来删除所有重复项,但保留那个ID最高的行。
你可以帮帮我吗? :)答案 0 :(得分:0)
您可以通过从重复项中获取最大ID然后删除不匹配的记录来执行此操作。这是一个例子:
DELETE FROM TablePhones TP
INNER JOIN (
SELECT MAX(id) id, T.phone
FROM TablePhones T
INNER JOIN (
SELECT phone
FROM TablePhones
GROUP BY phone
HAVING COUNT(1) > 1
) Subq
ON T.phone = Subq.phone
) SS
ON TP.phone = SS.phone
AND TP.ID <> SS.ID
此处,Subq Select收集重复的电话号码,然后SS子查询获取这些记录的最大ID。最终删除将选择与手机匹配的记录,但ID与MAX ID
不匹配