首先要解决的问题是如何读取一条数据后再基于这一条数据的信息与同一个表内的其他数据信息进行对比。
首先就是要知道连接:
两个关系通过笛卡尔积连接在一起时,保留属性间满足一定关系的元组即为连接。
连接又分为内连接和外连接;
内连接 又有 等值连接 和 自然连接 ;只保存两者都有值得情况。
等值连接保存即属性值相等的元组,而自然连接则是自动通过两个关系属性名字相同的属性进行合并并且删除重复列,一般等值连接操作时从行角度进行运算,但自然连接还需要取消重复列,所以时从行和列的角度进行运算。
用外连接基于自然连接之上选择保留原表中没有连接的元组(即悬浮元组)
具体可以看:
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)
成功!