删除重复数据
说明
表: Person
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| email | varchar |
+-------------+---------+
id是该表的主键列。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。
以 任意顺序 返回结果表。 (注意: 仅需要写删除语句,将自动对剩余结果进行查询)
查询结果格式如下所示。
示例 1:
输入:
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
来源:力扣(LeetCode)
题解
解法
在子查询中还要套一层的原因是为了避免sql版本出现 “You can't specify target table 'Person' for update in FROM clause” 这个错误的情况 下面的思路是 删除id(重复数据中)不是最小的数据 和 保留不在重复数据中的数据
delete from Person where
id not in
(select * from (select min(id) from Person group by email having count(email) > 1 ) b )
and
id not in (select a.id from (select * from Person group by email having count(email) = 1) a )