leetcode - 數據庫 - 196. 刪除重複的電子郵箱 - 爲什麼delete的時候select報錯?

      
      原題: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 

      我還是太年輕…
      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章