编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。

例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:

提示:
执行 SQL 之后,输出是整个 Person 表。
使用 delete 语句。
准备数据:
create table Person(
Id int(10) primary key not null,
Email varchar(50));
insert into Person values
(1, "john@example.com"),
(2, "bob@example.com"),
(3, "john@example.com");
先过滤出重复的邮箱
select Id,Email from Person
group by Email
having count(1)>1;

查询Email的类别
select distinct Email from Person;
调整思路:
思路1:利用左连接
delete a from
(Person a left join Person b on a.Email=b.Email)
where a.Id>b.Id;

思路2:利用自连接
自连接
select * from Person a ,Person b ;

注意:如果两个表连在一起,用逗号连接,就是笛卡尔乘积
筛选
select * from Person a ,Person b
where a.Email=b.Email ;

select * from Person a,Person b
where a.Email=b.Email and a.id >b.id;

只需要保留a表的信息
select a.* from Person a,Person b
where a.Email=b.Email and a.id >b.id;

删除id较大的重复值:
delete a.* from Person a,Person b
where a.Email=b.Email and a.id >b.id;

思路二:选取小Id
select min(Id) as Id,Email
from Person
group by Email;

总结:
- 注意自连接的写法
- 发散思考,不要死磕一条路
- 行动&认真&坚持
网友评论