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
  • 27218

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
  • 4834

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

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

数据库_基础知识_MySQL_UpdateSelect(根据查询出来的结果批量更新)

有两个表:SPEC1、tmpDOT SPEC1种一列为:HIGH tmpDOT共有两个:OLD、NEW 两个表的内容大概如下: SPEC1: ... HIGH ... ... A    ... ......

mysql基于查询结果批量插入和更新

One possible way to do this is to create a temporary table, insert the data into that, and then do 1...

mysql update from 子查询

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

MySQL数据库update更新子查询

比如: 1 2 3 4 UPDATE test.tb_vobile a set a.name = '111 ' ...

OCP-1Z0-051 第166题 使用子查询update表中的多列

一、原题 View the Exhibit and examine the structures of the EMPLOYEES and DEPARTMENTS tables. You want...

update子查询

 update 子查询 基础知识 1, 关联子查询和非关联子查询 在非关联子查询中,内部查询只执行一次并返回它的值给外部查询,然后外部查询在它的处理中使用内部查询返回给它的值。而在...

PostgreSQL UPDATE 中包含子查询的性能优化

摘要: 一位网友使用update t1 set info=(select info from t2 where t1.id=t2.id) where t1.id 一位网友使用update t1 ...
  • cicon
  • cicon
  • 2016年06月02日 12:54
  • 1663
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql的update子查询写法
举报原因:
原因补充:

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