关键词:(隐式)自连接
2022年12月7日
题目:
表: Person
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| email | varchar |
+-------------+---------+
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。
编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。
以 任意顺序 返回结果表。 (注意: 仅需要写删除语句,将自动对剩余结果进行查询)
解法:
delete
p1
from
Person p1,Person p2
where
p1.id>p2.id and p1.email = p2.email
1、delete p1
delete p1
表示要删除的是p1的记录,where
控制想要删除的数据满足的条件
2、p1.id > p2.id
从p1表中取出记录, 拿着这个条记录,依次到p2表中查找满足where条件的记录;
p1 p2
+----+------------------+ +----+------------------+
| id | email | | id | email |
+----+------------------+ +----+------------------+
| 1 | john@example.com | | 1 | john@example.com |
| 2 | bob@example.com | | 2 | bob@example.com |
| 3 | john@example.com | | 3 | john@example.com |
+----+------------------+ +----+------------------+
#(p1.id>p2.id and p1.email = p2.email)
# 拿p1表中的数据依次与p2表中的数据相对比,满足where条件就进行删除