举栗子:
delete from ta where id in (select max(id) from ta)
上述语句报错:
[Err] 1093 - You can't specify target table 'ta' for update in FROM clause
这是因为:在 mysql 中,不能先 select 一个表的记录,在按此条件进行更新和删除同一个表的记录。
正确用法:
delete from ta where id in (select uid from (select max(id) uid from ta) tb)
上述语句解决办法是:将select得到的结果,再通过中间表select一遍,这样就规避了错误。
关键点:
1、查询结果集的字段必须有别名,上例为 uid
2、查询结果集作为新表必须有别名,上例为 tb
3、再次查询所用的中间表 select 必须用之前起的字段别名,上例为 uid
注意:这个问题只出现于mysql,oracle不会出现此问题。
其它好文参考阅读:
https://blog.csdn.net/znb769525443/article/details/48245277
转载于:https://blog.51cto.com/maplebb/2166075