Oracle多表关联更新的语法

今天给客户批量更新数据,由于是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
)


 

请使用浏览器的分享功能分享到微信等