ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle多表关联更新的语法

Oracle多表关联更新的语法

Linux操作系统 作者:xiaoyan5686670 时间:2015-12-29 22:28:43 0 删除 编辑

今天给客户批量更新数据,由于是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/22569416/viewspace-1967079/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-07-25

  • 博文量
    108
  • 访问量
    196572