Mysql - sql查询根据条件删除重复行

时间:2012-08-06 20:27:28

标签: mysql sql

我有一个包含近100万条记录的数据库表 - 当我写一个查询以查看它们中有多少是重复的时候 - 有近90K的重复记录 - 重复我是指具有相同电子邮件地址的记录 - 喜欢一个电子邮件地址 - 可能有10条记录。

示例数据

ID | Name | Email            | phone
 1 | abc  | abc@gmail.com    | 12345
 2 | def  | def@gmail.com    | 12533
 3 | abc  | abc@gmail.com    | 
 4 | hij  | hij@gmail.com    | 50633   
 5 | abc  | abc@gmail.com    | 12345
 6 | def  | def@gmail.com    | 

1)ID是表的自动增量主键

2)如果有两条记录如def@gmail.com - 我需要保留有电话的记录并删除其他记录

3)现在加入abc@gmail.com - 有3条记录 - 没有电话的记录被删除 - 现在剩下的两条记录 - 虽然两者都有数据 - 保留第一条并删除第二条

是否可以根据条件编写删除语句,或者是否有更简单的方法来实现此目的。

使用 - http://sqlfiddle.com/#!2/cf8c7

的SQL小提琴

非常感谢

2 个答案:

答案 0 :(得分:0)

DELETE FROM phoney ph
WHERE ph.zphone IS NULL
AND EXISTS (SELECT *
        FROM phoney ex
        WHERE ex.zname = ph.zname
        AND ex.zemail = ph.zemail
        AND ex.zphone IS NOT NULL
        );

DELETE FROM phoney ph
WHERE ph.zphone IS NOT NULL
AND EXISTS (SELECT *
        FROM phoney ex
        WHERE ex.zname = ph.zname
        AND ex.zemail = ph.zemail
        AND ex.id < ph.id
        );

SELECT * FROM phoney;

结果:

DELETE 2
DELETE 1
 id | zname |    zemail     | zphone 
----+-------+---------------+--------
  1 | abc   | abc@gmail.com | 12345
  2 | def   | def@gmail.com | 12533
  4 | hij   | hij@gmail.com | 50633

注意:您可以组合两个删除查询,但这会导致WHERE CLAUSE中的AND / OR条件混乱,这是非常错误易发。

答案 1 :(得分:0)

尝试以下查询:

DELETE b.* FROM table1 a INNER JOIN table1 b ON a.name = b.name AND a.id < b.id