【MySQL】报错:You can‘t specify target table ‘Person‘ for update in FROM clause

错误的意思是说,不能在同一个mysql语句中先查询某些值,再修改这个表。

解决方法:就是将select出的结果再通过中间表select一遍。

注意:这个问题只出现于mysql

例子:删除重复的电子邮箱

表: Person

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| email       | varchar |
+-------------+---------+
id 是该表的主键列(具有唯一值的列)。
该表的每一行包含一封电子邮件。电子邮件将不包含大写字母。

编写解决方案 删除 所有重复的电子邮件,只保留一个具有最小 id 的唯一电子邮件。

(对于 SQL 用户,请注意你应该编写一个 DELETE 语句而不是 SELECT 语句。)

(对于 Pandas 用户,请注意你应该直接修改 Person 表。)

运行脚本后,显示的答案是 Person 表。驱动程序将首先编译并运行您的代码片段,然后再显示 Person 表。Person 表的最终顺序 无关紧要 。

返回结果格式如下示例所示。

示例 1:

输入: 
Person 表:
+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+
输出: 
+----+------------------+
| id | email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+
解释: john@example.com重复两次。我们保留最小的Id = 1。

错误解答:

delete from Person 
where id in (select p.id,p.email from Person p
JOIN Person e ON p.email=e.email
where p.id != e.id and p.id >e.id);

这条语句里,先执行了select然后又执行了delete,所以会报错以下错误

只需要就是将select出的结果再通过中间表select一遍,就可以,同时注意:要把结果表取个表明,因为每一个派生出来的表都必须给它命名一个自己的别名

delete from Person 
where id in (select id from(select p.id,p.email from Person p
JOIN Person e ON p.email=e.email
where p.id != e.id and p.id >e.id) a) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值