题目链接:https://leetcode-cn.com/problems/delete-duplicate-emails/

题目

编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小的那个。

+----+------------------+

| Id | Email |

+----+------------------+

| 1 | john@example.com |

| 2 | bob@example.com |

| 3 | john@example.com |

+----+------------------+

Id 是这个表的主键。

例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:

+----+------------------+

| Id | Email |

+----+------------------+

| 1 | john@example.com |

| 2 | bob@example.com |

+----+------------------+

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/delete-duplicate-emails

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

一开始觉得很简单啊,用 group by 就能解决问题,不过可能题目没说清楚,用 group by 提交一直不通过,本地测试是可以的,估计是必须要求用 delete 进行操作,而不是 select

---- MySQL ----
select min(Id) as Id,
Email
from Person
group by Email; -- 简单 只是不通过

参考官方答案之后的解答。

使用 deletewhere 子句进行解答。

---- MySQL ----
# Write your MySQL query statement below
delete a from Person a,
Person b
where a.Email = b.Email
and a.Id > b.Id ---- 707ms

MySQL还是不熟悉,语法跟oracle还是有一定的差别。

如果表名用了别名,delete后要加别名。

left join 试试看。

---- MySQL ----
delete a from Person a
left join Person b
on a.Email = b.Email
where a.Id > b.Id; ---- 726ms

通过 delete + 子查询,效率更高。

---- MySQL ----
delete from Person
where Id not in
(
select Id
from
(
select min(Id) as Id
from Person
group by Email
) b
); ---- 506ms

加多一层 select 是因为 deleteselect 不能同时对一个表进行操作,所以添加一层外查询之后会生成一个临时表,这样子就可以进行 delete 操作了。

思考

通过自连接之后,判断2个id的大小,再进行删除。

delete 操作还是比较陌生,毕竟平时用的比较多还是 select 操作,只需要查询数据,就ok。

最新文章

  1. 理解JAVA - 面向对象(object) - 属性,方法
  2. Sharepoint增加修改密码功能
  3. 关于android获得设备宽高
  4. ThinkPHP模板(一)
  5. poj 2782 Bin Packing (贪心+二分)
  6. JavaUtil_04_验证码生成器
  7. SDL2.0 vs2017环境配置
  8. Lombok快速入门
  9. day11---函数对象、名称空间、作用域、闭包函数
  10. python线程中的全局变量与局部变量
  11. 2018最完整ITTO分节整理指导(PMP项目管理入门必备)
  12. Python cffi学习(二)
  13. hello2
  14. POI HSSFCellStyle 设置 Excel 单元格样式
  15. 对于移动端 App,虚拟机注册或类似作弊行为有何应对良策?
  16. sqlserver触发器执行顺序【未经验证】
  17. Java远程方法协议(JRMP)
  18. js获取图片原始大小
  19. iOS 中长按手势回调会被触发过两次
  20. MyBatis_Study_002(进阶,增删改查)

热门文章

  1. win系统动态载入DLL所需要的三个函数详解(LoadLibrary,GetProcAddress,FreeLibrary)
  2. python 调用父类方法, 重写父类构造方法, 不显式调用,会报错
  3. JavaWeb MySQL 实现登录验证
  4. 5G 与 MEC 边缘计算
  5. CentOS7 升级 python3 过程及注意
  6. k8s管理机密信息(9)
  7. Eclipse安装Spring Tools Suites
  8. Linux操作系统使用RPMBUILD命令打包RPM的详细步骤
  9. WhatsApp Group vs WhatsApp Broadcast for Business
  10. CodeForces 1251A --- Broken Keyboard