原題:https://leetcode-cn.com/problems/delete-duplicate-emails/
我自己做leetcode的數據庫題目的解題記錄:
解題目錄 https://blog.csdn.net/weixin_42845682/article/details/105196004
題目描述
編寫一個 SQL 查詢,來刪除 Person 表中所有重複的電子郵箱,重複的郵箱裏只保留 Id 最小 的那個。
+----+------------------+
| Id | Email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
| 3 | john@example.com |
+----+------------------+
例如,在運行你的查詢語句之後,上面的 Person 表應返回以下幾行:
+----+------------------+
| Id | Email |
+----+------------------+
| 1 | john@example.com |
| 2 | bob@example.com |
+----+------------------+
提示:
執行 SQL 之後,輸出是整個 Person 表。
使用 delete 語句。
答案
第一種答案
答案
delete
from Person
where id not in(
select
min(p2.id) id
from person p2
group by p2.email
having(count(p2.id)>1)
)
將重複的郵件的id找出來,然後not in。
但是後來想了想,最小的不刪除,和重複不重複沒啥關係啊…於是,就去掉了having:
delete
from Person
where id not in(
select
min(p2.id) id
from person p2
group by p2.email
)
但是執行報錯,鬱悶。
後來查了查,需要這樣寫:
delete
from Person
where id not in(
select id
from(
select
min(p2.id) id
from person p2
group by p2.email
) tmp
)
年少無知,不知道爲啥…
解惑
經過問人,是因爲:mysql 不能對同一個表進行 update(delete) 和 select 聯合操作
具體情況可以參考:鏈接地址 https://blog.csdn.net/weixin_42845682/article/details/105449548
第二種答案
用join其實也可以:
delete
from person
where id in(
select id from(
select
p2.id id
from person p1
join person p2 on p1.email=p2.email
where p2.id>p1.id
) tmp
)
第三種答案
這個答案我沒想出來,我也沒想到還能這麼寫…
DELETE p1 FROM Person p1,
Person p2
WHERE
p1.Email = p2.Email AND p1.Id > p2.Id
我還是太年輕…