Oracle中只更新两张表对应数据的方法

2012-10-17来源 : 互联网

先建立一个结构一模一样的表emp1,并为其插入部分数据

create table emp1asselect * from emp where deptno = 20;  update掉emp1中的部分数据

update emp1set sal = sal + 100,comm = nvl(comm,0) + 50  然后我们试着使用emp1中数据来更新emp中sal 和 comm这两列数据。

  我们可以这么写

Update empSet(sal,comm) = (select sal,comm. From emp1 where emp.empno = emp1.empno)Where exists (select 1 from emp1 where emp1.empno = emp.empno)  请你尤其注意这里的where子句,你可以尝试不写where子句来执行以下这句话,你将会使得emp中的很多值变成空。

  这是因为在oracle的update语句中如果不写where子句,oracle将会默认的把所有的值全部更新,即使你这里使用了子查询并且某在值并不能在子查询里找到,你就会想当然的以为,oracle或许将会跳过这些值吧,你错了,oracle将会把该行的值更新为空。

  我们还还可以这么写:

update (select a.sal asal,b.sal bsal,a.comm acomm,b.comm bcomm from emp a,emp1 b where a.empno = b.empno)set asal = bsal,acomm = bcomm;  这里的表是一个类视图。当然你执行时可能会遇到如下错误:

  ERROR 位于第 2 行:

  ORA-01779: 无法修改与非键值保存表对应的列

  这是因为新建的表emp1还没有主键的缘故

  下面增加一个主键

alter table emp1 add constraint pk_emp1 primary key (empno);  执行之后

  在执行前面的语句就能成功。

  这里我们总结一下:

  在oracle中不存在update from结构,所以遇到需要从另外一个表来更新本表的值的问题的时候,有两种解决的办法:

  一种是使用子查询,使用子查询时一定要注意where条件(一般后面接exists子句),除非两个表是一一对应的,否则where条件必不可少,遗漏掉where条件时可能会导致插入大量空值。

  另外一种是类视图的更新方法,这也是oracle所*有的。先把对应的数据全部抽取出来,然后更新表一样更新数据,这里需要注意的是,必须**表的数据**型

免责声明内容来源于网络,本站不保证所有内容的完整性、真实性和准确性,如有侵权请及时联系,我们核对情况属实,对该内容进行下架删除。[删除申请]

咨询项目,请扫微信二维码。
微信扫码
在线咨询
领取资料
微信扫一扫、长按二维码、点击“在线咨询”,发送项目名或品牌名,立即咨询加盟项目。

温馨提醒创业有风险,投资需谨慎。为规避加盟投资风险,3158招商加盟网建议您在投资前务必多考察、多了解,降低创业风险。

©2004 3158招商加盟网. All Rights Reserved.

3158招商加盟网友情提示:投资有风险,选择需谨慎

张靓颖跨时空线上演唱会