数据库每日一题---第6天:删除重复的电子邮箱

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

一、问题描述

表: Person

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+
id是该表的主键列。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。

复制代码

编写一个 SQL 删除语句来 删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件。

任意顺序 返回结果表。 (注意: 仅需要写删除语句,将自动对剩余结果进行查询)

查询结果格式如下所示。

题目链接:删除重复的电子邮箱

二、题目要求

样例

输入: 
Person 表:
+----+------------------+
| id | email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
| 3  | [email protected] |
+----+------------------+
输出: 
+----+------------------+
| id | email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
+----+------------------+
解释: [email protected]重复两次。我们保留最小的Id = 1。

复制代码

考察

1.delete删除、自连接
2.建议用时10~25min
复制代码

三、问题分析

通常对于单个表进行操作的时候,我们通常采用自连接的方式,自连接其实本质上就是内连接的一种。

对于这一题,首先题目要求我们使用delete语句完成,如果只要求输出结果结果的话,我们可以使用distinct直接唯一化输出结果。

对于这一题如何使用delete语句输出结果呢?

先从Person表中定义两个p1、p2指向表中的数据,从通过p1从表的第一条数据开始遍历,和p2的数据进行比较。

如果数据满足email的值相同,并且id值比p2要大,这样就满足了删除重复的电子邮箱,并且优先保留序号较小的id数据。

四、编码实现

delete p1
from Person p1,Person p2
where p1.email=p2.email and p1.id>p2.id
复制代码

五、测试结果

2.png

1.png

19.png

猜你喜欢

转载自juejin.im/post/7104997283250307102