一、题目描述
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
±—±-----------------+
| Id | Email |
±—±-----------------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
±—±-----------------+
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:
±—±-----------------+
| Id | Email |
±—±-----------------+
| 1 | [email protected] |
| 2 | [email protected] |
±—±-----------------+
二、题解
方法一:delete + join
我们可以使用如下代码将Person表与其自身结合起来
SELECT * FROM Person p1 join Person p2 on p1.Email = p2.Email;
然后查找出id较大的
SELECT * FROM Person p1 join Person p2 on p1.Email = p2.Email AND p1.Id > p2.Id;```
最后转化为delete子句
```sql
DELETE p1
FROM Person p1 JOIN Person p2
ON p1.Email = p2.Email AND p1.id>p2.id;
当然也可可以使用where语句
Delete p1 from Person p1,Person p2
where p1.Email = p2.Email AND p1.id>p2.id;