【力扣MySQL】196. 删除重复的电子邮箱

196. 删除重复的电子邮箱 - 力扣(LeetCode)

对于 SQL 用户,请注意你应该编写一个 DELETE 语句而不是 SELECT 语句。

运行脚本后,显示的答案是 Person 表。驱动程序将首先编译并运行您的代码片段,然后再显示 Person 表。Person 表的最终顺序 无关紧要 。

 这是题干的一部分,表明了他最后给的输出是修改后的Person表,也就是说你的所有select操作都不会有输出。然而对于使用delete语句来说,应该先使用select语句进行查询,在确认要删除的数据之后在进行delete操作,这样更加安全。但是本题不会把你select的结果展示给你,只能靠一直删除修改Person表来确定结果。真正操作数据库的时候可不会给你第二次删除的机会,删错了数据只能回滚了,非常麻烦。这里建议先在182的代码框里面敲select,感觉对了再去196里面敲delete

本题思路与181相似,也是一表分俩表两次查询,一个表查询重复的邮箱,将其命名为a;一个表查询首次出现的邮箱,也就是重复邮箱中id最小的那个邮箱,将其命名为b,然后我们可以写一个select语句: 

select *
from person a,person b
where a.email = b.email

这样得到的是该表的 笛卡尔乘积 中的两个元素相等的有序对:

有什么用呢?哈哈,没用,只是将这个表内连接一下,也就是把a表和b表连接起来;

然后就是按照条件找到要删除的那条数据,条件是保留id最小的那条数据,也就是删除所有id较大的数据,所以要删的数据在a表中:

select a.*
from person a,person b
where a.email = b.email
and a.id > b.id

这样要删除的数据就找到了,将select改为delete就可以了,回到196试一下:

delete a
from person a,person b
where a.email = b.email
and a.id > b.id

 

这里delete后面那个a一定要写,不然它不知道要删那个表中的数据(因为前面我们已经分为两个表了)就会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值