zoukankan      html  css  js  c++  java
  • 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

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

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

    
    
  • 相关阅读:
    【纯水题】POJ 1852 Ants
    【树形DP】BZOJ 1131 Sta
    【不知道怎么分类】HDU
    【树形DP】CF 1293E Xenon's Attack on the Gangs
    【贪心算法】CF Emergency Evacuation
    【思维】UVA 11300 Spreading the Wealth
    【树形DP】NOI2003 逃学的小孩
    【树形DP】BZOJ 3829 Farmcraft
    【树形DP】JSOI BZOJ4472 salesman
    【迷宫问题】CodeForces 1292A A NEKO's Maze Game
  • 原文地址:https://www.cnblogs.com/summary-2017/p/9064173.html
Copyright © 2011-2022 走看看