只更新emp1 表中部门10与20的数据,其他部门保持 noname不变
create table emp1 as select * from emp;
alter table EMP1 add dname varchar2(20) default 'noname';
select * from emp1;
update emp1
set dname =
(select dept.dname
from dept
where dept.deptno = emp1.deptno
and dept.dname in ('ACCOUNTING', 'RESEARCH'));
select * from emp1;
看似没问题,其实这一步是更新了全表的数据
原本值应该为 'noname'
这是因为更新之前,为对原表emp1的数据集做限定,所以会默认更新为全表数据(括号里的查询关联只是为了配到的数据更新为设定的值,为匹配的默认更新为null)
正确代码:
update emp1
set dname =
(select dept.dname
from dept
where dept.deptno = emp1.deptno
and dept.dname in ('ACCOUNTING', 'RESEARCH'))
where exists (select 1
from dept
where dept.deptno = emp1.deptno
and dept.dname in ('ACCOUNTING', 'RESEARCH'))
select * from emp1;
在更新或者删除重要数据前,记得备份
执行前先转化为查询语句,看一下结果是否为想要的,再执行
^ - ^ ……