删除重复数据

118 阅读1分钟

删除重复数据

说明

表: 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)

链接:leetcode.cn/problems/de…

题解

解法

在子查询中还要套一层的原因是为了避免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 )