SQL语句题 | 删除重复的电子邮箱

目录

  • 题目
  • 分析
    • 第一步 查找邮箱和最小的 Id
    • 第二步 查找需要删除的项
    • 第三步 删除
  • 解法一
  • 解法二 官方解法
  • 对比

题目

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

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
| 3  | [email protected] |
+----+------------------+

Id 是这个表的主键。

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

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
+----+------------------+

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-duplicate-emails

分析

为避免误删,一般在删除之前,需要先查找到需要删除的项,确认数据正确后再进行删除。

第一步 查找邮箱和最小的 Id

SELECT MIN(Id) Id,Email FROM person group by Email

结果:

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
+----+------------------+

已经找到需要保留的项,通过 not in子查询就可以找到需要删除的项

第二步 查找需要删除的项

SELECT * FROM person 
WHERE Id NOT IN (SELECT MIN(Id) Id FROM person group by Email);

结果:

+----+------------------+
| Id | Email            |
+----+------------------+
| 3  | [email protected] |
+----+------------------+

第三步 删除

DELETE FROM person 
WHERE Id NOT IN (SELECT MIN(Id) Id FROM person group by Email);

结果:

You can't specify target table 'person' for update in FROM clause

出现这个问题的原因,与所使用的数据库有关。在MYSQL里,不能先select一个表的记录,在按此条件进行更新和删除同一个表的记录,采用子查询可以解决这个问题。

解法一

DELETE FROM person WHERE Id NOT IN (
SELECT Id FROM (
SELECT MIN(Id) Id FROM person group by Email
)t
);

解法二 官方解法

DELETE p1 FROM Person p1,
    Person p2
WHERE
    p1.Email = p2.Email AND p1.Id > p2.Id

作者:LeetCode
链接:https://leetcode-cn.com/problems/delete-duplicate-emails/solution/shan-chu-zhong-fu-de-dian-zi-you-xiang-by-leetcode/
来源:力扣(LeetCode)

对比

记录数 解法一 解法二
1056 受影响的行: 961 时间: 0.062s 受影响的行: 951 时间: 1.219s
10000 受影响的行: 9896 时间: 0.490s 受影响的行: 9895 时间: 137.480s

SQL语句题,除了满足题意之外,最主要的就是判断SQL语句的执行效率,在未添加索引的情况下,如上表,解法二随着记录数的增加,执行时间会越来越长,主要是由于解法二进行了“笛卡儿积”的计算,效率非常低。

你可能感兴趣的:(#,java开发)