先建立一个结构一模一样的表emp并为其插入部分数据
create table emp
as
select * from emp where deptno = ;
update掉emp中的部分数据
update emp
set sal = sal +
comm = nvl(comm) +
然后我们试着使用emp中数据来更新emp中sal 和 comm这两列数据
我们可以这么写
Update emp
Set(salcomm) = (select salcomm From emp where empempno = empempno)
Where exists (select from emp where empempno = empempno)
请你尤其注意这里的where子句你可以尝试不写where子句来执行以下这句话你将会使得emp中的很多值变成空
这是因为在oracle的update语句中如果不写where子句oracle将会默认的把所有的值全部更新即使你这里使用了子查询并且某在值并不能在子查询里找到你就会想当然的以为oracle或许将会跳过这些值吧你错了oracle将会把该行的值更新为空
我们还还可以这么写
update (select asal asalbsal bsalm acomm
m bcomm from emp aemp b where aempno = bempno)
set asal = bsal
acomm = bcomm;
这里的表是一个类视图当然你执行时可能会遇到如下错误:
ERROR 位于第 行:
ORA: 无法修改与非键值保存表对应的列
这是因为新建的表emp还没有主键的缘故
下面增加一个主键
alter table emp
add constraint pk_emp primary key (empno);
执行之后
在执行前面的语句就能成功
这里我们总结一下
在oracle中不存在update from结构所以遇到需要从另外一个表来更新本表的值的问题的时候有两种解决的办法:
一种是使用子查询使用子查询时一定要注意where条件(一般后面接exists子句)除非两个表是一一对应的否则where条件必不可少遗漏掉where条件时可能会导致插入大量空值
另外一种是类视图的更新方法这也是oracle所独有的先把对应的数据全部抽取出来然后更新表一样更新数据这里需要注意的是必须保证表的数据唯一型