相同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:執行正常
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2136996/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL無法建立表的問題分析(r12筆記第73天)MySql筆記
- MySQL中的derived table(r12筆記第47天)MySql筆記
- MySQL傳輸表空間小結(r12筆記第2天)MySql筆記
- 在eclipse中配置MySQL原始碼環境(r12筆記第14天)EclipseMySql原始碼筆記
- MySQL原始碼安裝總結(r12筆記第12天)MySql原始碼筆記
- Oracle閃回原理測試(三)(r12筆記第16天)Oracle筆記
- Oracle 12c DBCA淺析(r12筆記第48天)Oracle筆記
- MySQL中的binlog和redo淺析(r12筆記第5天)MySql筆記
- MySQL自增列的重複值問題(r12筆記第25天)MySql筆記
- MySQL service啟動指令碼淺析(r12筆記第59天)MySql指令碼筆記
- 一種Oracle快速的整合遷移方案(r12筆記第98天)Oracle筆記
- 歸零的心態(r12筆記第82天)筆記
- mysqlpump的效能測試(r12筆記第89天)MySql筆記
- MySQL的update語句避坑MySql
- MySQL數值型別在binlog中需要注意的細節(r12筆記第69天)MySql型別筆記
- 我爸爸眼中的我(r12筆記第22天)筆記
- 一個IT人和ppt的故事(r12筆記第39天)筆記
- 我的女兒二三事(七)(r12筆記第58天)筆記
- 玩足彩的一點感受(r12筆記第80天)筆記
- Mysql跨表更新 多表update sql語句總結MySql
- 使用pt工具檢測MySQL主從延遲(r12筆記第7天)MySql筆記
- 分分鐘搭建MySQL一主多從環境(r12筆記第31天)MySql筆記
- mysqldump的一點使用總結(r12筆記第81天)MySql筆記
- 駕考的一點總結(r12筆記第93天)筆記
- MySQL主從不一致發現的細小問題分析(r12筆記第63天)MySql筆記
- 分分鐘搭建MySQL Group Replication測試環境(二)(r12筆記第41天)MySql筆記
- MySQL -update語句流程總結MySql
- MySql與Sql Server Update語句MySqlServer
- ORACLE 動態語句的筆記Oracle筆記
- MySQL中insert語句沒有響應的問題分析(r11筆記第21天)MySql筆記
- MySQL自增列主從不一致的測試(r12筆記第37天)MySql筆記
- 推薦最近收藏的幾篇文章(r12筆記第85天)筆記
- mysqlpump和mysqldump的效能大比拼(r12筆記第90天)MySql筆記
- MySQL中的批量初始化資料的對比測試(r12筆記第71天)MySql筆記
- 寫在2016年底(r11筆記第30天)筆記
- ORACLE多表關聯UPDATE語句Oracle
- ORACLE多表關聯UPDATE 語句Oracle
- sandbox和MHA快速測試(r12筆記第32天)筆記