3

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

样本数据

身份证 | 姓名 | 电子邮件 | 电话
 1 | 美国广播公司 | abc@gmail.com | 12345
 2 | 定义 | def@gmail.com | 12533
 3 | 美国广播公司 | abc@gmail.com |
 4 | 嗨| hij@gmail.com | 50633   
 5 | 美国广播公司 | abc@gmail.com | 12345
 6 | 定义 | def@gmail.com |

1)ID是表的自增主键

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

3)现在以 abc@gmail.com 为例 - 有 3 条记录 - 没有手机的一条被删除 - 现在从剩下的两条中删除 - 尽管两者都有所有数据 - 保留第一条并删除第二条

是否可以根据条件编写删除语句,或者是否有更简单的方法来完成此操作。

一个可以玩的 SQLfiddle - http://sqlfiddle.com/#!2/cf8c7

非常感谢

4

2 回答 2

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 子句中的 AND/OR 条件混乱,这容易出错。

于 2012-08-06T20:57:51.247 回答
0

试试下面的查询:

DELETE b.* FROM table1 a INNER JOIN table1 b ON a.name = b.name AND a.id < b.id
于 2013-12-09T12:52:57.417 回答