LeetCode:Delete Duplicate Emails - 删除重复的邮箱数据

1、题目名称

Delete Duplicate Emails(删除重复的邮箱数据)

2、题目地址

https://leetcode.com/problems/delete-duplicate-emails/

3、题目内容

写一个SQL删除表Person中所有的重复数据,对于重复的数据只保留Id最小的数据

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+
Id is the primary key column for this table.

例如,在执行完该SQL后,表中剩余数据如下:

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+

4、初始化数据库脚本

在MySQL数据库中建立一个名为LEETCODE的数据库,用MySQL命令行中的source命令执行下面脚本:

-- 执行脚本前必须建立名为LEETCODE的DATABASE
USE LEETCODE;
  
DROP TABLE IF EXISTS Person;
CREATE TABLE Person (
  Id INT NOT NULL PRIMARY KEY,
  Email VARCHAR(50)
);

-- INSERT INTO Person (Id, Email) VALUES (1, 'john@example.com');
-- INSERT INTO Person (Id, Email) VALUES (2, 'bob@example.com');
-- INSERT INTO Person (Id, Email) VALUES (3, 'john@example.com');
INSERT INTO Person (Id, Email) VALUES (1, 'tsybius@example.com');
INSERT INTO Person (Id, Email) VALUES (2, 'tsybius@example.com');

5、解题SQL1

下面是一个比较简单的写法

DELETE P2 FROM Person AS P1, Person AS P2
WHERE  P1.Email = P2.Email AND
       P1.Id < P2.Id;

6、解题SQL2

另一种写法是使用 NOT IN 来写,但下面的写法是有问题的,放在MySQL中执行时会报错

DELETE FROM Person
WHERE  Id NOT IN (SELECT MIN(ID) MIN_ID
                  FROM   Person
                  GROUP  BY Email)

报错信息如下:

ERROR 1093 (HY000): You can't specify target table 'Person' for update in FROM clause

这是因为SELECT语句不能直接出现在UPDATE语句(DELETE语句也是一样)的WHERE子句中,把SQL改成下面这样就可以AC了:

DELETE FROM Person
WHERE  Id NOT IN (SELECT TMP.MIN_ID
                  FROM   (SELECT MIN(ID) MIN_ID
                          FROM   Person
                          GROUP  BY Email) TMP);

END

转载于:https://my.oschina.net/Tsybius2014/blog/644854

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值