You can‘t specify target table ‘Person‘ for update in FROM clause

eddaegaew發表於2021-01-02

題目:編寫一個 SQL 查詢,來刪除 Person 表中所有重複的電子郵箱,重複的郵箱裡只保留 Id 最小 的那個。

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+

Id 是這個表的主鍵。
例如,在執行你的查詢語句之後,上面的 Person 表應返回以下幾行:

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+
 

提示:
執行 SQL 之後,輸出是整個 Person 表。
使用 delete 語句。

報錯答案:

delete from Person
where Id not in
(select min(id) from Person
group by Email)

執行這條語句時會報錯:You can’t specify target table ‘Person’ for update in FROM clause

這是因為MySQL不允許同時查詢和刪除一張表,我們可以通過子查詢的方式包裝一下即可避免這個報錯

delete from Person
where Id not in
(select id from
(select min(id) as id from Person
group by Email) as t
)

相關文章