oracle和mysql的sql语句不同_相同update语句在MySQL,Oracle的不同表现(r12笔记第30天)...

今天有个朋友问我一个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:执行正常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值