本文主要是介绍MySQL实现同一语句中先查后改,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
delete from tbl where id in
(select max(id) from tbl a where EXISTS(select 1 from tbl b where a.tac=b.tac group by tac HAVING count(1)>1)group by tac
)
改写成下面就行了:
代码如下:
delete from tbl where id in
(select a.id from (select max(id) id from tbl a where EXISTS(select 1 from tbl b where a.tac=b.tac group by tac HAVING count(1)>1)group by tac) a
)
也就是说将select出的结果再通过中间表select一遍,这样就规避了错误。注意,这个问题只出现于mysql,mssql和Oracle不会出现此问题。
You can't specify target table for update in FROM clause含义:不能在同一表中查询的数据作为同一表的更新数据。
例如:
我想查询t_user_asset的余额加上50000作为更新字段f_cashAmount的值,这样写是不行的。
UPDATE t_user_asset SET f_cashAmount = ( SELECT (ua.f_cashAmount+50000) cashAmount FROM t_user_asset ua WHERE ua.f_userId = 290 )
WHERE f_userId = 290
修改成以下写法就行,意思就是变个方向,在select外边套一层,让数据库认为你不是查同一表的数据作为同一表的更新数据:
UPDATE t_user_asset SET f_cashAmount =
(
SELECT ub.cashAmount FROM
(
SELECT (ua.f_cashAmount+50000) cashAmount FROM t_user_asset ua WHERE ua.f_userId = 290
) ub
)
WHERE f_userId = 290
以上问题只针对mysql数据库
这篇关于MySQL实现同一语句中先查后改的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!