mysql的update子查询写法

为了实现oracle和mysql都能通用,对oracle数据库语句进行转换。

如下代码

UPDATE btjs_xszffwbt a

   SET sys_djztms = '已过期', sys_djzt = 2, sys_spzt = 5, sys_spztms  = '已过期'

 WHERE sys_spzt = 1

   AND xjsxsrq <= '$date$'

   AND sys_djzt = 1

   AND x_id = (select xxid from btjs_xszffwbt where x_id = '$pkid$');

问题现象:Oracle数据库里无错,但在mysql里面报错

报错提示:[Err] 1093 - You can't specify target table 'a' for update in FROM clause

报错排查:最后一句AND x_id = (select xxid from btjs_xszffwbt where x_id = '$pkid$');

Mysql数据库无法识别

报错分析:MySQL是通过临时表来实现FROM子句里面的嵌套查询,那么把嵌套查询装进另外一个嵌套查询里,可使FROM子句查询和保存都是在临时表里进行,然后间接地在外围查询被引用。

解决方式:

方式一:UPDATE btjs_xszffwbt a, btjs_xszffwbt b

   SET a.sys_djztms = '已过期', a.sys_djzt = 2, a.sys_spzt = 5, a.sys_spztms  = '已过期'

 WHERE a.sys_spzt = 1

   AND a.xjsxsrq <= '$date$'

   AND a.sys_djzt = 1

   AND a.x_id = b.xxid AND b.x_id = '$pkid$'

问题:mysql能识别,在oracle里无法识别,报错:missing SET keyword


方式二:UPDATE btjs_xszffwbt a

   SET sys_djztms = '已过期', sys_djzt = 2, sys_spzt = 5, sys_spztms  = '已过期'

 WHERE sys_spzt = 1

   AND xjsxsrq <= '$date$'

   AND sys_djzt = 1

   AND x_id = (select xxid from  (

         select * from btjs_xszffwbt

      ) as x where x_id = '$pkid$');

问题:mysql能识别,在oracle里无法识别,报错:missing right parenthesis


正确写法为:

   UPDATE btjs_xszffwbt a

   SET sys_djztms = '已过期', sys_djzt= 2, sys_spzt= 5, sys_spztms  = '已过期' 

 WHERE sys_spzt = 1 

   AND xjsxsrq <= '$date$' 

   AND sys_djzt = 1 

   AND x_id = (select x_idfrom  (

         select xxid from btjs_xszffwbt where x_id = '$pkid$') xx)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值