加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

相同update语句在MySQL,Oracle的不同表现

发布时间:2022-03-25 19:03:52 所属栏目:MySql教程 来源:互联网
导读:今天有个朋友问我一个SQL问题,大体是一个update语句,看起来逻辑没有问题,但是执行的时候却总是报错。 语句和报错信息为: UPDATE payment_data rr SET rr.penalty_date = 2017-4-12 where rr.id = (SELECT min(r.id) FROM payment_data r where data_no
      今天有个朋友问我一个SQL问题,大体是一个update语句,看起来逻辑没有问题,但是执行的时候却总是报错。
 
      语句和报错信息为:
 
UPDATE payment_data rr
   SET rr.penalty_date = '2017-4-12'
 where rr.id =
       (SELECT min(r.id)
          FROM payment_data r
         where data_no =
               (SELECT data_no
                  FROM user_debt
                 WHERE out_trade_no = 'bestpay_order_no1491812746329'));
ERROR 1093 (HY000): You can't specify target table 'rr' for update in FROM clause   对于这个问题,如果不想使用中间表,那么可以改写为下面的形式,就是中间做了一个包装来规避这个问题。
 
UPDATE payment_data rr
   SET rr.penalty_date = '2017-4-12'
 where rr.id =
       (SELECT min(t.id)
          FROM (select id,data_no from payment_data r) t
         where t.data_no =
               (SELECT data_no
                  FROM user_debt
                 WHERE out_trade_no = 'bestpay_order_no1491812746329'));   但是这个问题才是开始,我对比了一下在两个数据库的表现,还是有很大的差别,我们先在MySQL复现一下。
 
创建两个表如下:
 
create table payment_data(id int,data_no varchar(30), penalty_date date);
create table user_debt(out_trade_no varchar(30), data_no varchar(30));
 
在Oracle中数据类型稍有变化。
 
create table payment_data(id int,data_no varchar2(30), penalty_date date);
create table user_debt(out_trade_no varchar2(30), data_no varchar2(30));然后我会逐个运行下面的4个语句,同时标识在MySQL,Oracle的表现。
 
1)语句1
 
UPDATE payment_data rr
   SET rr.penalty_date = '2017-4-12'
 where rr.id =
       (SELECT min(r.id)
          FROM payment_data r
         where data_no =
               (SELECT data_no
                  FROM user_debt
                 WHERE out_trade_no = 'bestpay_order_no1491812746329'));
MySQL: 会报错,提示DML语句不能同时查询同一个表。
 
Oracle:无报错,可以正确解析和执行。
 
2)语句2
 
UPDATE payment_data rr
   SET rr.penalty_date = '2017-4-12'
 where rr.id =
       (SELECT min(t.id)
          FROM (select id,data_no from payment_data r) t
         where t.data_no =
               (SELECT data_no
                  FROM user_debt
                 WHERE out_trade_no = 'bestpay_order_no1491812746329'));
 
MySQL:执行成功
 
Oracle: 执行成功
 
3)语句3
 
UPDATE payment_data rr, (SELECT min(r.id) id
          FROM payment_data r
         where data_no =
               (SELECT data_no
                  FROM user_debt
                 WHERE out_trade_no = 'bestpay_order_no1491812746329')) t
   SET rr.penalty_date = '2017-4-12'
 where rr.id =t.id;MySQL:能够正确执行
 
Oracle:解析出错
 
 
4)语句4
UPDATE payment_data rr
   SET rr.penalty_date = '2017-4-12'
 where rr.id =
       (SELECT min(r.id)
          FROM payment_data r
         inner join user_debt b on r.data_no = b.data_no
          WHERE b.out_trade_no = 'bestpay_order_no1491812746329');MySQL:执行失败
 
Oracle:执行正常

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读