通过SQL删除重复的条目?

Chr*_*wes 4 sql

在SQL中是否有可能删除(只有一个)组合列的重复条目(这里:city,zip)?所以,如果我有这个SQL:

INSERT INTO foo (id, city, zip) VALUES (1, 'New York', '00000')
INSERT INTO foo (id, city, zip) VALUES (2, 'New York', '00000')
Run Code Online (Sandbox Code Playgroud)

我可以稍后用sql语句删除第一个吗?我的方法不起作用

DELETE FROM foo (id, city, zip) 
       WHERE id IN 
             (SELECT id FROM foo GROUP BY id HAVING (COUNT(zip) > 1))
Run Code Online (Sandbox Code Playgroud)

Ada*_*tan 6

改编自本文.这两个解决方案是通用的,应该适用于任何合理的SQL实现.

原地删除重复项:

DELETE T1
FROM foo T1, foo T2
WHERE (T1.city = T2.city AND foo1.zip=foo2.zip) -- Duplicate rows
   AND T1.id > T2.id;                           -- Delete the one with higher id
Run Code Online (Sandbox Code Playgroud)

简单,并且应该适用于没有重复的小表或表.

将不同的记录复制到另一个表:

CREATE TABLE foo_temp LIKE(foo);
INSERT INTO foo_temp (SELECT distinct city, zip) FORM foo;
TRUNCATE TABLE foo;
Run Code Online (Sandbox Code Playgroud)

如果你有幸将序列作为你的id,那么简单地说:

INSERT INTO foo SELECT * FROM foo_temp;
DROP TABLE foo_temp;
Run Code Online (Sandbox Code Playgroud)

有点复杂,但对于具有大量重复的非常大的表非常有效.对于这些,为(city,zip)创建索引将极大地提高查询性能.