声明:
今天是第49道题。编写一个 SQL 查询,来删除 Person
表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:编写一个 SQL 查询,来删除 Person
表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
+----+------------------+ | Id | Email | +----+------------------+ | 1 | [email protected] | | 2 | [email protected] | | 3 | [email protected] | +----+------------------+ Id 是这个表的主键。例如,在运行你的查询语句之后,上面的
Person
表应返回以下几行:+----+------------------+ | Id | Email | +----+------------------+ | 1 | [email protected] | | 2 | [email protected] | +----+------------------+
解法1。不用两表join,直接用where判断比较,耗时1022 ms, 在Delete Duplicate Emails的MySQL提交中击败了84.39% 的用户,代码如下。
delete p1 from Person p1, Person p2 where p1.Email = p2.Email and p1.Id > p2.Id
解法2。先两表join,所以会耗时更多,然后再选择删除Id值更大的样本行,耗时1358 ms, 在Delete Duplicate Emails的MySQL提交中击败了43.57% 的用户,代码如下。
delete p1 from Person p1 join Person p2 on p1.Email = p2.Email where p1.Id > p2.Id