1、需求
在同一張表中,將2019年數據的AAG004字段值 更新 到2020年數據的AAG006字段中。
2、表結構 AAG01
銀行 | AAG01 | AZY001 | 年度 |
銀行 | AAG01 | AAG000 | 系統碼 |
銀行 | AAG01 | AAG001 | 銀行編碼 |
銀行 | AAG01 | AAG002 | 銀行名稱 |
銀行 | AAG01 | AAG004 | 一點清算行號 |
銀行 | AAG01 | AAG006 | 支付行號 |
銀行 | AAG01 | AZY005 | 停用標誌 |
3、DB2的寫法:
update AAG01 as a
set a.AAG006 = (select b.AAG004 from AAG01 as b where b.AAG000=a.AAG000 and b.AZY001='2019' and b.AZY005='0')
where a.AZY005='0' and a.AZY001='2020'
mysql的寫法:
update aag01 a,aag01 b
set a.aag006=b.aag004
where a.AAG000=b.aag000 and a.AZY001='2020'
and a.azy005='0' and b.azy001='2019' and b.azy005='0'
如果按照db2的寫法到mysql環境中執行會報錯:
格式:You can't specify target table '表名' for update in FROM clause
You can't specify target table 'a' for update in FROM clause
翻譯爲:不能先select出同一表中的某些值,再update這個表(在同一語句中)
4、db2寫法中用到了關於update set from where 寫法,這個需要掌握。
關於update set from where
下面是這樣一個例子:
兩個表a、b,想使b中的ClientName 字段值等於a表中對應id的name值
表a:id,name
1 王
2 李
3 張
表b:id,ClientName
1
2
3
(MS SQL Server)語句:
update b set ClientName = a.name from a,b where a.id = b.id
(Oralce)語句:
update b set (ClientName) = (SELECT name FROM a WHERE b.id = a.id)
(Mysql)語句::
UPDATE A, B SET A1 = B1, A2 = B2, A3 = B3 WHERE A.ID = B.ID
update set from 語句格式
當where和set都需要關聯一個表進行查詢時,整個 update執行時,就需要對被關聯的表進行兩次掃描,顯然效率比較低。
對於這種情況,Sybase和SQL SERVER的解決辦法是使用UPDATE...SET...FROM...WHERE...的語法,實際上就是從源表獲取更新數據。
在 SQL 中,表連接(left join、right join、inner join 等)常常用於 select 語句,其實在 SQL 語法中,這些連接也是可以用於update 和 delete 語句的,在這些語句中使用 join 還常常得到事半功倍的效果。
Update T_OrderForm SET T_OrderForm.SellerID =B.L_TUserID
FROM T_OrderForm A LEFT JOIN T_ProductInfo B ON B.L_ID=A.ProductID
用來同步兩個表的數據!
Oralce和DB2都支持的語法:
UPDATE A SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)
MS SQL Server不支持這樣的語法,相對應的寫法爲:
UPDATE A SET A1 = B1, A2 = B2, A3 = B3 FROM A LEFT JOIN B ON A.ID = B.ID
個人感覺MS SQL Server的Update語法功能更爲強大。MS SQL SERVER的寫法:
UPDATE A SET A1 = B1, A2 = B2, A3 = B3 FROM A, B WHERE A.ID = B.ID
在Oracle和DB2中的寫法就比較麻煩了,如下:
UPDATE A SET (A1, A2, A3) = (SELECT B1, B2, B3 FROM B WHERE A.ID = B.ID)
WHERE ID IN (SELECT B.ID FROM B WHERE A.ID = B.ID)
Mysql的寫法是:
UPDATE A, B SET A1 = B1, A2 = B2, A3 = B3 WHERE A.ID = B.ID
文章第四點參考:https://blog.csdn.net/xcbsdu/article/details/6736503