本文主要向大家介绍了Oracle数据库之oracle update set select from 关联更新,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助。
工作中有个需求,现在新表中有一些数据跟老表的基本一样,这样只需要把老表中数据搬到新表中就可以了,同时把不同的字段修改下数据即可,在修改字段时发 现,需要指定一个条件,比如主键id,来修改某条记录,这样一条一条修改效率太低了,有没有批量操作的方式 呢?SQL>select * from wwn2;
TOWN ID
-------------------- ----------
222 222
111 111
ww‘jj 111
llll 1111
dddd 2222
lllldf 111
lllldf 111
dsafdf 111
3435 111
ljjjjj 222
dsafdf 111
3435 111
ljjjjj 222
SQL> select * from wwm5;
TOWN ID
-------------------- ----------
lllldf 111
test 9984
SQL> select wwm2.* from wwm2,wwm5 where wwm2.id=wwm5.id
TOWN ID
-------------------- ----------
111 111
ww‘jj 111
lllldf 111
lllldf 111
dsafdf 111
3435 111
dsafdf 111
3435 111
8 rows selected.
--需要更新8条数据是正确的
下面是一个错误的做法:
SQL> update wwm2 set wwm2.town=(select wwm5.town from wwm5 where wwm5.id=wwm2.id)
13 rows updated.
SQL> select * from wwm2;
TOWN ID
-------------------- ----------
222
lllldf 111
lllldf 111
1111
2222
lllldf 111
lllldf 111
lllldf 111
lllldf 111
222
lllldf 111
lllldf 111
222
13 rows selected.
--可以看到13条记录被更新,符合条件的更新正确,不符合条件的也更新为NULL.以下是正确的方法
解决方法:
方法一:
SQL> update wwm2
2 set town=(select town from wwm5 where wwm5.id=wwm2.id)
3 where id=(select wwm5.id from wwm5 where wwm5.id=wwm2.id)
方法二:
SQL> update wwm2
set town=(select town from wwm5 where wwm5.id=wwm2.id)
where exists (select 1 from wwm5 where wwm5.id=wwm2.id)
方法三:
1 declare
2 cursor cur_wwm is select town,id from wwm5;
3 begin
4 for my_wwm in cur_wwm loop
5 update wwm2 set town=my_wwm.town
6 where id=my_wwm.id;
7 end loop;
8 end;
说 明:如果select 子句可以返回多行记录,但返回适合where条件的记录只能是唯一的,否则将会报返回单行的select子句返回多行的错误,因为 update只能跟据此处的where子句(内层where)进行相应记录的匹配更新,一次只能是一条。实际使用的sql为:
update table1 s set s.yesterday = (select yesterday from table1_BACK sb where sb.tagname = s.tagname and rownum = 1) where s.tagname = (select tagname from table1_BACK sb where sb.tagname = s.tagname);update table1 s set s.yesterday = (select yesterday from table1_BACK sb where sb.tagname = s.tagname and rownum = 1) where exists (select 1 from table1_BACK sb where sb.tagname = s.tagname);
转自:http://m.zhizuobiao.com/oracle/oracle-18091000132/