我有一个包含近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小提琴非常感谢
答案 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