Oracle多表關聯更新的語法

msdnchina發表於2008-11-20

今天給客戶批次更新資料,由於是oracle資料庫,oracle的多表更新語法和 sql server/sybase的語法不一樣,

於是就把幾年前搜來的oracle多表更新語法copy了過來

Oracel 示例:
update landleveldata a
set (a.gqdltks, a.bztks)=
(select b.gqdltks, b.bztks   from gdqlpj b
   where a.GEO_Code=b.lxqdm) 
  

改好後

update lswlzd  a
set a.lswlzd_wlmc=
(select b.newmc   from kgcwltz081120 b
   where a.lswlzd_wlbh=b.wlbh)

,在pl/sql中一執行,結果,報錯誤ora-01407,無法更新lc0349999.lswlzd.lswlzd_wlmc為null,

一開始我以為,kgcwltz081120 這個對照表有問題,結果,檢查了一下,沒有為null 的,後來,搜了一下網上的資料,發現是多表更新語法寫的有問題, 以上語法是 是將   表   lswlzd    中   lswlz d_wlmc 列   的值全部更新,更新的值為:     select b.newmc   from kgcwltz081120 b   where a.lswlzd_wlbh=b.wlbh  (沒有對應上的更新為null.)    

這也就是那個ora-01407錯誤的來歷。

 

正確的oracle多表更新的語法為:

update lswlzd  a
set a.lswlzd_wlmc=
(select b.newmc   from kgcwltz081120 b
   where a.lswlzd_wlbh=b.wlbh)
where exists
(select 1
 from kgcwltz081120 b
 where  a.lswlzd_wlbh=b.wlbh)

下邊的語句是建立KGCWLTZ081120 這個對照表的語句:

CREATE TABLE LC0349999.KGCWLTZ081120
(
    WLBH  VARCHAR2(30)  NOT NULL,
    OLDMC VARCHAR2(200) NOT NULL,
    NEWMC VARCHAR2(200) NOT NULL
)


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/161195/viewspace-498161/,如需轉載,請註明出處,否則將追究法律責任。

相關文章