文章目录
- 1 题目描述
- 2 解题思路
- 2.1 代码实现
1 题目描述
表: Person
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| email | varchar |
+-------------+---------+
id 是该表的主键列(具有唯一值的列)。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。
编写解决方案 删除 所有重复的电子邮件,只保留一个具有最小 id
的唯一电子邮件, 请注意你应该编写一个 DELETE 语句而不是 SELECT 语句
运行脚本后,显示的答案是 Person
表。驱动程序将首先编译并运行您的代码片段,然后再显示 Person
表。Person
表的最终顺序 无关紧要 。
返回结果格式如下示例所示。
示例 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
2 解题思路
- 使用
inner join
,形成笛卡尔积 - 如果 email 相同,但是id不同说明有重复
- email 相同的, 需要把 id 大的删除,从而保留小id的数据
2.1 代码实现
Person p1 inner join Person p2 on p1.email = p2.email
, Person表内联自己, 查询 email 相同的数据
查询出来的数据 2, 3, 4 行是同一条数据关联自己where p1.id > p2.id
从 eamil 相同数据中筛选出不是同一条数据, 且 id 大的数据
delete p1 from Person p1
指定删除p1
表中的数据
最终代码实现
delete p1 from Person p1 inner join Person p2 on p1.email = p2.email where p1.id > p2.id