• 想要精通算法和SQL的成长之路 - 删除重复的电子邮箱(SQL)


    想要精通算法和SQL的成长之路 - 删除重复的电子邮箱(SQL)

    前言

    想要精通算法和SQL的成长之路 - 系列导航

    一. 删除重复的电子邮箱

    原题链接
    有一张Person表:
    在这里插入图片描述

    编写一个SQL删除语句来删除所有重复的电子邮件,只保留一个id最小的唯一电子邮件。

    1.1 子查询(中间表相关知识点)

    首先,我们可以去考虑如何拿到每种邮件最小id值:那么我们就需要用到group by 邮件 以及min(id)

    select min(p.id) as d_id from Person p group by p.email
    
    • 1

    结果如下(数据量大的话会更直观一点):
    在这里插入图片描述

    之那么既然我们要保留这个数据,那么删除的时候,只需要反过来即可。删除不在上述返回结果集中的数据即可,即not in

    DELETE  from Person where id not in (select min(p.id) as d_id from Person p group by p.email)
    
    • 1

    但是这么写却有一个问题:
    在这里插入图片描述
    意思是不能先select出同一表中的某些值,再update这个表。即不能依据某字段值做判断再来更新某字段的值。

    因此对于这种SQL,需要用到中间表来做查询,上述SQL修改为:

    DELETE from Person where id not in (
    	select d_id from (
    		select min(p.id) as d_id from Person p group by p.email
    	) t1
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.2 自连接

    自连接的方式很直白:

    DELETE p1 FROM Person p1,
        Person p2
    WHERE
        p1.email = p2.email AND p1.id > p2.id
    
    • 1
    • 2
    • 3
    • 4

    意思是:删除p1表中的数据,需要删除的数据需要满足下面的条件。

    1. p1表和p2表的数据的邮箱一致。
    2. p1表的id要大于p2表的id

    那么以p1表中的第一条数据为例:
    在这里插入图片描述
    p2表中没有符合条件的,因为id为1是最小的,因此该条数据不删除。
    在这里插入图片描述


    再以p1表中的第二条数据为例:
    在这里插入图片描述
    p2表中依旧没有符合条件的。


    p1表中的第三条数据为例:
    在这里插入图片描述
    它的idp2表中的第一条数据要大,并且邮箱相同,满足条件,删除。
    在这里插入图片描述

    二. 总结

    最终结果:

    # 方案一
    DELETE from Person where id not in (
    	select d_id from (
    		select min(p.id) as d_id from Person p group by p.email
    	) t1
    )
    # 方案二
    DELETE p1 FROM Person p1,
        Person p2
    WHERE
        p1.email = p2.email AND p1.id > p2.id
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    知识点:不能依据某字段值做判断再来更新某字段的值。 伪代码表示就是:

    update / delete xxx wherein ( selectwhere 条件)
    
    • 1

    这个时候需要运用中间表来做一次查询。

  • 相关阅读:
    CSS总结---持续更新中 2022.8.4
    安科瑞智能母线监控在数据中心的应用
    多分辨率展开
    工作手机定制服务
    工业视觉——打光
    【一、定制搭建-Arm平台的QT交叉编译环境】
    Redis学习(2)—— 常用命令
    第4章 决策树
    究竟什么是微服务开源框架?
    FPGA时序约束(一)基本概念入门及简单语法
  • 原文地址:https://blog.csdn.net/Zong_0915/article/details/127620848