mysql的update子查询写法

原创 2016年05月30日 10:09:37

为了实现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)




版权声明:本文为博主原创文章,未经博主允许不得转载。

[mysql] mysql 在update中实现子查询的方式

mysql update中实现子查询的方式---测试代码---------------drop table if exists tb;create table IF NOT EXISTS tb (Na...
  • xys_777
  • xys_777
  • 2010年08月06日 16:09
  • 28673

mysql update使用子查询

今天我像以前操作Oracle写了一个update sql:update device_user a set a.scene_id=null where a.id not in(select max(...
  • p_3er
  • p_3er
  • 2016年04月07日 10:42
  • 6207

MYSQL的UPDATE子查询,UPDATE时避免使用子查询

UPDATE t_csi_comment SET is_valid = 0 WHERE         comment_id IN (                 SELECT     ...
  • dagailv
  • dagailv
  • 2017年05月29日 17:57
  • 823

mysql update使用子查询

今天我像以前操作Oracle写了一个update sql: update device_user a set a.scene_id=null where a.id not in(select mi...
  • weixin_38637161
  • weixin_38637161
  • 2018年01月24日 17:19
  • 24

mysql update from 子查询

这个破问题纠结了我好久,查了mysql的好多资料,最后还是在别人那里得到结果,特此记录一下,留个备份吧! mssql 子查询更新 update log set uin= b.u...
  • ni_hao_ya
  • ni_hao_ya
  • 2013年08月29日 14:44
  • 10305

MySQL数据库update更新子查询

比如: ? 1 2 3 4 UPDATE test.tb_vobile a set a.name = '111 ...
  • hellowindowns
  • hellowindowns
  • 2015年11月29日 17:00
  • 317

mysql update in 嵌套子查询更新

更新该句update punchcard_tblset percheck=3where id in (select id punchcard where id=1) 在 MySQL 命令列工具中传回:...
  • zq32206124
  • zq32206124
  • 2011年02月26日 15:13
  • 14018

MySQL数据库update更新子查询

比如: 1 2 3 4 UPDATE test.tb_vobile a set a.name = '111 ' ...
  • tomakemyself
  • tomakemyself
  • 2017年07月02日 16:51
  • 430

mysql update 子查询

select max(id) as id from djgl_dzqt_replace_audit where audit_genre = 3  and audit_result = 0  and s...
  • hety119
  • hety119
  • 2016年07月19日 15:07
  • 161

MySQL 中 delete ,update语句的子查询限制

场景一 delete from student where id = (select max(id) from student); [Err] 1093 - You can't specify...
  • u012102536
  • u012102536
  • 2017年03月10日 14:29
  • 350
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql的update子查询写法
举报原因:
原因补充:

(最多只允许输入30个字)