oracle update set select from 关联更新

  工作中有个需求,现在新表中有一些数据跟老表的基本一样,这样只需要把老表中数据搬到新表中就可以了,同时把不同的字段修改下数据即可,在修改字段时发现,需要指定一个条件,比如主键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)进行相应记录的匹配更新,一次只能是一条。


以下这个方法不适用,因为ORA-01427: single-row subquery returns more than one row,一个测点对应多条记录

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);

实际使用的sql为:

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);

 

参考原文链接https://blog.csdn.net/disiwei1012/article/details/52589181

 

写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,文章可以转载,无需版权。希望尽自己的努力,做到更好,大家一起努力进步!

如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!


 

posted @ 2018-05-20 18:41  緈諨の約錠  阅读(1404)  评论(0编辑  收藏  举报
//用户复制动作发生0.1秒以后再去改粘贴板中的内容。100ms只是一个经常取值,写1000、10、50、200……都行。