主頁(yè) > 知識(shí)庫(kù) > 在Oracle數(shù)據(jù)庫(kù)中同時(shí)更新兩張表的簡(jiǎn)單方法

在Oracle數(shù)據(jù)庫(kù)中同時(shí)更新兩張表的簡(jiǎn)單方法

熱門標(biāo)簽:服務(wù)外包 呼叫中心市場(chǎng)需求 鐵路電話系統(tǒng) 百度競(jìng)價(jià)排名 地方門戶網(wǎng)站 AI電銷 Linux服務(wù)器 網(wǎng)站排名優(yōu)化

以前只會(huì)寫一些簡(jiǎn)單的updaet語(yǔ)句,比如updae table set c1='XXX' 之類的

今天遇到一個(gè)數(shù)據(jù)訂正的問(wèn)題,項(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)語(yǔ)法錯(cuò)誤。而且確實(shí)還有些小小細(xì)節(jié)沒(méi)有注意到。

首先上測(cè)試數(shù)據(jù)

表1,ZZ_TEST1

表2,ZZ_TEST2

要把表一的text更新成表二的text1值,對(duì)應(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的寫法,對(duì)應(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ù)對(duì)應(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 的語(yǔ)法,經(jīng)過(guò)測(cè)試在oracle和mysql中不適用


總結(jié)一下,項(xiàng)目中嘗嘗需要把一張表的字段更新到另一張表中的某一個(gè)字段??梢允褂胾pdate語(yǔ)法,并要做好限定。會(huì)使用merge的語(yǔ)法,另外還有一種merge的語(yǔ)法也可以,update from 不能再oracle和mysql中使用。

標(biāo)簽:湖南 湘潭 崇左 仙桃 銅川 衡水 蘭州 黃山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在Oracle數(shù)據(jù)庫(kù)中同時(shí)更新兩張表的簡(jiǎn)單方法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266