【力扣数据库题库】196. 删除重复的电子邮箱 表与自身一一查询匹配,表的内连接 如何让表与表的语句一一对比

在这里插入图片描述
首先要解决的问题是如何读取一条数据后再基于这一条数据的信息与同一个表内的其他数据信息进行对比。

首先就是要知道连接:
两个关系通过笛卡尔积连接在一起时,保留属性间满足一定关系的元组即为连接。
连接又分为内连接和外连接;

内连接 又有 等值连接 和 自然连接 ;只保存两者都有值得情况。
等值连接保存即属性值相等的元组,而自然连接则是自动通过两个关系属性名字相同的属性进行合并并且删除重复列,一般等值连接操作时从行角度进行运算,但自然连接还需要取消重复列,所以时从行和列的角度进行运算。

外连接基于自然连接之上选择保留原表中没有连接的元组(即悬浮元组)

具体可以看:

https://blog.csdn.net/weixin_43992162/article/details/117533562
数据库:笛卡儿积、连接、等值连接、自然连接、外连接、嵌套循环连接、排序合并连接、索引连接和哈希连接
写得太好了

所以这一题,首先是判断是否有重复的email值,有的话就将id大的删掉!所以使用表和表自身内连接实现一条数据和全表数据的一一对比!(笛卡尔积+筛选出需要删除的email值相同的属性条件,所以是内连接
连接语句有join也有以下方式:反正就是创建带条件的笛卡尔积

delete p1.* from Person p1,Person p2 
where p1.email = p2.email and p1.id > p2.id

另外的答案:
了一个思路:先分组,后判断email相同时是否有多个id。

# Please write a DELETE statement and DO NOT write a SELECT statement.
# Write your MySQL query statement below

delete * 
from Person
where id not in
(select id as ids 
from 
(select min(p2.id) as ida from Person p2
 group by p2.email))

写到这里他一直提示我在这里插入图片描述
我一直在想到底是哪里需要设置别名,后面才发现是中间的派生类,判断id是否在类内,因此此类也需要一个别名。

delete  
from Person
where id not in
(select *
from 
(select min(p2.id) as ida from Person p2
 group by p2.email)
t)

成功!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值