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

题目:编写一个 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
)

你可能感兴趣的:(mysql)