196. 删除重复的电子邮箱

189 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

一、题目

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

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

创建数据表

根据题意创建Person表,并设置数据类型,填充数据

CREATE TABLE Person(
	id INT,
	email VARCHAR(20)
);
INSERT INTO Person VALUES
(1,"john@example.com"),
(2,"bob@example.com"),
(3,"john@example.com");
  • 显示数据表

image.png

解题思路

  • 通过使用SELECT语句查询当前数据表重复的email
  • 查询重复的email中id最大的那条数据
  • 根据上边的查询条件把这条数据删除就完成了

查询重复的email

// 最后两个是重复的数据表
SELECT p1.* FROM Person p1, Person p2 WHERE p1.email = p2.email;

image.png

查询重复中id最大的那条数据

SELECT p1.* FROM Person p1, Person p2 WHERE p1.email = p2.email AND p1.Id > p2.Id;

image.png 将该条数据删除

DELETE p1 FROM Person p1, Person p2 WHERE p1.email = p2.email AND p1.Id > p2.Id;

image.png

三、执行结果

测试结果

image.png

四、总结

本题的解决思路看上去似乎很简单,但对于初学者的我来讲还是比较复杂的,复杂的不在于他的逻辑,而在于不知道比较重复还可以这么使用,这个思路对我来说可能更重要, 写这个还是非常有意的。