1.题目
表: Person
±------------±--------+
| Column Name | Type |
±------------±--------+
| id | int |
| email | varchar |
±------------±--------+
id是该表的主键列。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。
以 任意顺序 返回结果表。 (注意: 仅需要写删除语句,将自动对剩余结果进行查询)
2.示例
输入:
Person 表:
+----+------------------+
| id | email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
| 3 | john@example.com |
+----+------------------+
输出:
+----+------------------+
| id | email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
+----+------------------+
解释: john@example.com重复两次。我们保留最小的Id = 1。
3. 答案
分析:
- 要求删除重复出现的email,保留id最小的
①.连接
找出这样的记录,他的email和其他某些记录相同,且id大于其他记录的id,此时删除此记录.
delete p1 from Person p1,Person p2
where p1.Email=p2.Email and p1.id>p2.id
②.分组
注意每个派生出来的表都需要起别名,例如下面的表t
delete from Person where id not in
(select id from (select min(id) as id from Person group by Email)t);
错误答案
想法1: 对于每条记录,判断是否存在id比他小且email相同的记录,存在就删除。
delete from Person where exists
(select * from Person p1 where p1.email=email and p1.id<id);
想法2:将关系表按 email分组,查询出每组的最小id,删除其他id所在行
delete from Person where id not in (select min(id) from Person group by Email);
通用问题:
You can’t specify target table ‘Person’ for update in FROM clause
不能在同一个sql语句中,先select同一个表的某些值,然后再update这个表。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/delete-duplicate-emails