這篇文章主要介紹了在Oracle數(shù)據(jù)庫中同時(shí)更新兩張表的簡單方法,同時(shí)介紹了一種差異性合并更新的方法,需要的朋友可以參考下
以前只會(huì)寫一些簡單的updaet語句,比如updae table set c1='XXX' 之類的
今天遇到一個(gè)數(shù)據(jù)訂正的問題,項(xiàng)目背景如下,有個(gè)表A,有兩個(gè)字段a1,a2還有一個(gè)關(guān)聯(lián)表B,其中也有兩個(gè)字段,b1和b2。其中a2和b2是關(guān)聯(lián)的,想把A中的字段a1更新成B中的b1
理論上sql應(yīng)該挺好寫的,但是在oralce中實(shí)現(xiàn)了半天一直報(bào)語法錯(cuò)誤。而且確實(shí)還有些小小細(xì)節(jié)沒有注意到。
首先上測試數(shù)據(jù)
表1,ZZ_TEST1
表2,ZZ_TEST2
要把表一的text更新成表二的text1值,對應(yīng)的sql如下:
- 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條件表示一個(gè)限制條件,只更新那些符合條件的數(shù)據(jù),也可以寫成
- 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 )
另外還有一種merge的寫法,對應(yīng)的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中有多條數(shù)據(jù)對應(yīng)T1中的數(shù)據(jù),可以把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 的語法,經(jīng)過測試在oracle和mysql中不適用
總結(jié)一下,項(xiàng)目中嘗嘗需要把一張表的字段更新到另一張表中的某一個(gè)字段。可以使用update語法,并要做好限定。會(huì)使用merge的語法,另外還有一種merge的語法也可以,update from 不能再oracle和mysql中使用。
新聞熱點(diǎn)
疑難解答
圖片精選