gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:04:20 26 4
gpt4 key购买 nike

我有一个包含近 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 条记录 - 没有电话的记录被删除 - 现在剩下的两条 - 尽管两者都有所有数据 - 保留第一个并删除第二个

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

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

非常感谢

最佳答案

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 条件困惑,这是非常错误-容易发生。

关于Mysql - 根据条件删除重复行的sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11835439/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com