ORALCE如何update兩個表的數據

之前只會寫一些簡單的updaet語句,好比updae table set c1='XXX' 之類的 html

今天遇到一個數據訂正的問題,項目背景以下,有個表A,有兩個字段a1,a2還有一個關聯表B,其中也有兩個字段,b1和b2。其中a2和b2是關聯的,想把A中的字段a1更新成B中的b1 mysql

理論上sql應該挺好寫的,可是在oralce中實現了半天一直報語法錯誤。並且確實還有些小小細節沒有注意到。 sql

首先上測試數據 oracle

表1,ZZ_TEST1 測試

表2,ZZ_TEST2 spa

要把表一的text更新成表二的text1值,對應的sql以下: code


update ZZ_TEST1 t1 set t1."text" = (
  select T2."text1" from  ZZ_TEST2 t2 where T2."pid"=t1."id"
) 
WHERE EXISTS
(
  SELECT 1 FROM  ZZ_TEST2 t2 where T2."pid"=t1."id"
)
後面的where條件表示一個限制條件,只更新那些符合條件的數據,也能夠寫成


update ZZ_TEST1 t1 set t1."text" = (
 select T2."text1" from  ZZ_TEST2 t2 where T2."pid"=t1."id"
)
where t1."id" in (select "pid" from ZZ_TEST2 )

參考文檔: htm

http://ww.ciotimes.com/bi/oracle/64228.html ci

另外還有一種merge的寫法,對應的sql以下: 文檔

merge into ZZ_TEST1 t1 using ZZ_TEST2  t2 on (t1."id" =t2."pid") 

when matched then 

update set t1."text"=t2."text1"
爲了不T2中有多條數據對應T1中的數據,能夠把sql改爲以下的方式:

MERGE INTO ZZ_TEST1 t1 USING 
( 
SELECT * FROM ZZ_TEST2 X WHERE X. ROWID = 
(SELECT MAX(Y.ROWID) FROM ZZ_TEST2 Y WHERE X."id" = Y."id" )
 ) 
t2 
ON (t1."id" = t2."pid") 
WHEN MATCHED THEN 
UPDATE SET t1."text" = t2."text1"

還有一種update from 的語法,通過測試在oracle和mysql中不適用

其語法規則以下:

http://www.frogjumpjump.com/2011/09/sql-update-from.html


總結一下,項目中嚐嚐須要把一張表的字段更新到另外一張表中的某一個字段。能夠使用update語法,並要作好限定。會使用merge的語法,另外還有一種merge的語法也能夠,update from 不能再oracle和mysql中使用。

相關文章
相關標籤/搜索