错误的意思是说,不能在同一个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)