資源描述:
《Oracle -Update 多表關(guān)聯(lián)》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、一條Update更新語句是不能更新多張表的,除非使用觸發(fā)器隱含更新。而表的更新操作中,在很多情況下需要在表達(dá)式中引用要更新的表以外的數(shù)據(jù)。我們先來討論根據(jù)其他表數(shù)據(jù)更新你要更新的表???一、MS???SQL???Server??多表關(guān)聯(lián)更新????sqlserver提供了update的from子句,可以將要更新的表與其它的數(shù)據(jù)源連接起來。雖然只能對一個(gè)表進(jìn)行更新,但是通過將要更新的表與其它的數(shù)據(jù)源連接起來,就可以在update的表達(dá)式中引用要更新的表以外的其它數(shù)據(jù)。????一般形式:updateASET字段1=B表字段
2、表達(dá)式,字段2=B表字段表達(dá)式??fromBWHERE???邏輯表達(dá)式例如:???UPDATEdbo.Table2???SETdbo.Table2.ColB=dbo.Table2.ColB+dbo.Table1.ColB???FROMdbo.Table2???INNERJOINdbo.Table1???ON(dbo.Table2.ColA=dbo.Table1.ColA);???實(shí)際更新的操作是在要更新的表上進(jìn)行的,而不是在from子句所形成的新的結(jié)果集上進(jìn)行的二、Oracle????多表關(guān)聯(lián)更新????Oracle沒
3、有updatefrom語法,可以通過兩種實(shí)現(xiàn)方式:1、利用子查詢:????update???A??????SET???字段1=(select???字段表達(dá)式???from???B???WHERE???...),????????字段2=(select???字段表達(dá)式???from???B???WHERE???...)??????WHERE???邏輯表達(dá)式?????UPDATE多個(gè)字段兩種寫法:寫法一:UPDATEtable_1a??SETcol_x1=(SELECTb.col_y1,b.col_y2FROMtable_2
4、bWHEREb.col_n=a.col_m),??????col_x2=(SELECTb.col_y2FROMtable_2bWHEREb.col_n=a.col_m)WHEREEXISTS(SELECT*FROMtable_2bWHEREb.col_n=a.col_m)或UPDATEtable_1a??SETcol_x1=(SELECTb.col_y1,b.col_y2FROMtable_2bWHEREb.col_n=a.col_m),??????col_x2=(SELECTb.col_y2FROMtable_2bW
5、HEREb.col_n=a.col_m)WHEREa.col_m=(SELECTb.col_nFROMtable_2bWHEREb.col_n=a.col_m)寫法二:UPDATEtable_1a??SET(col_x1,col_x2)=(SELECTb.col_y1,b.col_y2FROMtable_2bWHEREb.col_n=a.col_m)WHEREEXISTS(SELECT*FROMtable_2bWHEREb.col_n=a.col_m);或UPDATEtable_1a??SET(col_x1,col_x
6、2)=(SELECTb.col_y1,b.col_y2FROMtable_2bWHEREb.col_n=a.col_m)WHEREa.col_m=(SELECTb.col_nFROMtable_2bWHEREb.col_n=a.col_m)注意:???1.對于子查詢的值只能是一個(gè)唯一值,不能是多值。???2.子查詢在絕大多數(shù)情況下,最后面的whereEXISTS子句是重要的,否則將得到錯(cuò)誤的結(jié)果。且whereEXISTS子句可用另一方法代替,如上。最后的子句是對a表被更新記錄的限制,如無此句,對于a表中某記錄,如在b表
7、中關(guān)聯(lián)不到對應(yīng)的記錄,則該記錄被更新字段將被更新為null。whereEXISTS子句就是排除對a表中該情況的記錄進(jìn)行更新。2、利用視圖:UPDATE(SELECTA.NAMEANAME,B.NAMEBNAMEFROMA,BWHEREA.ID=B.ID)SETANAME=BNAME;??注意:???1.對于視圖更新的限制:???如果視圖基于多個(gè)表的連接,那么用戶更新(update)視圖記錄的能力將受到限制。除非update只涉及一個(gè)表且視圖列中包含了被更新的表的整個(gè)主鍵,否則不能更新視圖的基表。另外,Oracle中的D
8、elete的from子句也沒有多表聯(lián)接的功能,只能通過子查詢的方式來做:deletefrom表Awhereexists(select*from表Bwhere表A.empid=表B.empid)deletefrom表Awhere表A.empidin(selectempidfrom表B)三、oracle視圖多表更新在oracle中通常