代码拉取完成,页面将自动刷新
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
Id | |
---|---|
1 | john@example.com |
2 | bob@example.com |
3 | john@example.com |
Id 是这个表的主键。
例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:
Id | |
---|---|
1 | john@example.com |
2 | bob@example.com |
法一: 使用 group by
进行连接
参考链接 - 一只猪的解题思路 - 及其Niyada 、17693410138评论
create TABLE LC196(Id int(10), Email VARCHAR(20));
insert into LC196 VALUES(1, 'john@example.com');
insert into LC196 VALUES(2, 'bob@example.com');
insert into LC196 VALUES(3, 'john@example.com');
insert into LC196 VALUES(4, 'bon@example.com');
-- 法一:使用group by, 再取min(id)
DELETE from LC196 a
where a.id not in
(
SELECT need.id from
(select min(id) as id
from LC196
GROUP BY email
) as need
);
-- 使用 exists 优化
DELETE from LC196 a
where not exists
(
select need.id from
(
select min(id) as id from LC196 GROUP BY email
) as need
where need.id = a.id
);
-- 法二:自连接
-- 自连接
SELECT p1.*
FROM LC196 p1,
LC196 p2
WHERE
p1.Email = p2.Email
-- 找出重复的id大的值
SELECT p1.*
FROM LC196 p1,
LC196 p2
WHERE
p1.Email = p2.Email AND p1.Id > p2.Id;
-- 删除
DELETE p1 FROM LC196 p1,
LC196 p2
WHERE
p1.Email = p2.Email AND p1.Id > p2.Id;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。