本文转自:http://blog.csdn.net/disiwei1012/article/details/52589181

http://www.blogjava.net/Jhonney/archive/2010/06/25/324503.html

  1. $ sqlplus user/pass
  2.  
  3. SQL*Plus: Release 9.2.0.6. - Production on Wed Aug ::
  4.  
  5. Copyright (c) , , Oracle Corporation. All rights reserved.
  6.  
  7. Connected to:
  8. Oracle9i Enterprise Edition Release 9.2.0.6. - 64bit Production
  9. With the Partitioning, OLAP and Oracle Data Mining options
  10. JServer Release 9.2.0.6. - Production
  11.  
  12. SQL> select * from wwm2; --要更新的表
  13.  
  14. TOWN ID
  15. -------------------- ----------
  16.  
  17. ww'jj 111
  18. llll
  19. dddd
  20. lllldf
  21. lllldf
  22. dsafdf
  23.  
  24. ljjjjj
  25. dsafdf
  26.  
  27. TOWN ID
  28. -------------------- ----------
  29.  
  30. ljjjjj
  31.  
  32. SQL> select * from wwm5; --更新的条件表
  33.  
  34. TOWN ID
  35. -------------------- ----------
  36. lllldf
  37. test
  38.  
  39. SQL> select wwm2.* from wwm2,wwm5 where wwm2.id=wwm5.id
  40. /
  41.  
  42. TOWN ID
  43. -------------------- ----------
  44.  
  45. ww'jj 111
  46. lllldf
  47. lllldf
  48. dsafdf
  49.  
  50. dsafdf
  51.  
  52. rows selected.
  53.  
  54. 所以,每次需要更新8条数据就是正确的.
  55.  
  56. 相信程序员是通过以下类似的SQL更新的,这是错误的,因为没有加WHERE
  57. SQL> update wwm2 set wwm2.town=(select wwm5.town from wwm5 where wwm5.id=wwm2.id)
  58. /
  59.  
  60. rows updated.
  61.  
  62. SQL> select * from wwm2;
  63.  
  64. TOWN ID
  65. -------------------- ----------
  66.  
  67. lllldf
  68. lllldf
  69.  
  70. lllldf
  71. lllldf
  72. lllldf
  73. lllldf
  74.  
  75. lllldf
  76.  
  77. TOWN ID
  78. -------------------- ----------
  79. lllldf
  80.  
  81. rows selected.
  82.  
  83. 可以看到13条记录被更新,符合条件的更新正确,不符合条件的也更新为NULL.以下是正确的方法
  84.  
  85. 方法一:
  86. SQL> update wwm2
  87. set town=(select town from wwm5 where wwm5.id=wwm2.id)
  88. where id=(select wwm5.id from wwm5 where wwm5.id=wwm2.id)
  89. /
  90.  
  91. rows updated.
  92.  
  93. 方法二: 与方法一道理相同,这里需要掌握EXIST的相关用法.
  94. SQL> update wwm2
  95. set town=(select town from wwm5 where wwm5.id=wwm2.id)
  96. where exists (select from wwm5 where wwm5.id=wwm2.id)
  97. rows updated.
  98.  
  99. 方法三:
  100. SQL> update (select a.town atown,a.id aid,b.town btown,b.id bid from wwm2 a,wwm5 b where a.id=b.id)
  101. set atown=btown
  102. /
  103. set atown=btown
  104. *
  105. ERROR at line :
  106. ORA-: cannot modify a column which maps to a non key-preserved table
  107.  
  108. * alter table wwm5 add primary key (id)
  109. SQL> /
  110.  
  111. Table altered.
  112.  
  113. update (select a.town atown,a.id aid,b.town btown,b.id bid from wwm2 a,wwm5 b where a.id=b.id)
  114. * set atown=btown
  115. SQL> /
  116.  
  117. rows updated.
  118.  
  119. 这种方法的局限性就是需要PRIMARY 的支持.
  120.  
  121. 方法四:
  122. 1 declare
  123. 2 cursor cur_wwm is select town,id from wwm5;
  124. 3 begin
  125. 4 for my_wwm in cur_wwm loop
  126. 5 update wwm2 set town=my_wwm.town
  127. 6 where id=my_wwm.id;
  128. 7 end loop;
  129. 8* end;
  130. SQL> /
  131.  
  132. PL/SQL procedure successfully completed.
  133.  
  134. SQL> select * from wwm2;
  135.  
  136. TOWN ID
  137. -------------------- ----------
  138.  
  139. lllldf
  140. lllldf
  141. llll
  142. dddd
  143. lllldf
  144. lllldf
  145. lllldf
  146. lllldf
  147. ljjjjj
  148. lllldf
  149.  
  150. TOWN ID
  151. -------------------- ----------
  152. lllldf
  153. ljjjjj
  154.  
  155. 这个方法是最灵活的了.
  156.  
  157. 方法五:
  158.  
  159. 注意,方法五只能适用于WWM5WWM2的子集的时候.
  160. merge into wwm2
  161. using (select town,id from wwm5) b
  162. on (wwm2.id=b.id)
  163. when matched then update set town=b.town
  164. * when not matched then insert (town,id) values (null,null)
  165. SQL> /
  166.  
  167. rows merged.
  168.  
  169. SQL> select * from wwm2;
  170.  
  171. TOWN ID
  172. -------------------- ----------
  173. ---注意这个地方,被插入了一个空值.因为WWM5ID=9984WWM2中不能匹配,根本原因是ORACLE9必须有WHEN NOT MATCHED子句,但是ORACLE10可以不许要,也就是ORACLE10可以不写WHEN NOT MATCHED ,就不必插入NULL值了,为解决这个问题,下一步会DELETE WWM5ID=,这样一来就不会执行WHEN NOT MATCHED
  174.  
  175. lllldf
  176. lllldf
  177. llll
  178. dddd
  179. lllldf
  180. lllldf
  181. lllldf
  182. lllldf
  183. ljjjjj
  184.  
  185. TOWN ID
  186. -------------------- ----------
  187. lllldf
  188. lllldf
  189. ljjjjj
  190.  
  191. rows selected.
  192.  
  193. SQL> delete from wwm5 where id=;
  194.  
  195. row deleted.
  196.  
  197. SQL> merge into wwm2
  198. SQL> using (select town,id from wwm5) b
  199. SQL> on (wwm2.id=b.id)
  200. SQL> when matched then update set town=b.town
  201. SQL> * when not matched then insert (town,id) values (null,null)
  202. SQL> /
  203.  
  204. rows merged.
  205.  
  206. 以上就是5种关连更新的例子了,希望能给开发人员解惑.
  207.  
  208. 说明:如果select 子句可以返回多行记录,但返回适合where条件的记录只能是唯一的,否则将会报返回单行的select子句返回多行的错误,因为update只能跟据此处的where子句(内层where)进行相应记录的匹配更新,一次只能是一条。

[转]oracle update set select from 关联更新的更多相关文章

  1. oracle update set select from 关联更新

    工作中有个需求,现在新表中有一些数据跟老表的基本一样,这样只需要把老表中数据搬到新表中就可以了,同时把不同的字段修改下数据即可,在修改字段时发现,需要指定一个条件,比如主键id,来修改某条记录,这样一 ...

  2. oracle学习笔记:update一整列 关联更新

    普通的 update 都是根据条件来对部分列的内容进行修改,用法如下: update temp_cwh_table set name = 'xxx' where id = 1; 假设现在有2张表:A. ...

  3. Oracle update和select 关联

    Oracle update和select 关联 目录 Oracle update和select 关联 1.介绍 2.解决方法 2.1.需求 2.2.错误演示 2.3.解决方法 1.介绍 本文主要向大家 ...

  4. Update和Select结合统计更新

    Update和Select结合统计更新 update table_a set updatetime=getdate(), name=b.name from (select name,age from ...

  5. Oracle update时做表关联

    感觉还是sqlserver中的写法比较好理解,Oracle的写法都快把我搞晕了, 注意: 1.要修改的表,不要加入到子查询中,用别名在子查询中与其他表进行关联即可. 2.exsits不能少,exsit ...

  6. Oracle\MS SQL Server Update多表关联更新

    原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...

  7. 转 update关联更新在sqlserver和oracle中的实现

    sqlserver和oracle中实现update关联更新的语法不同,都可以通过inline view(内嵌视图)来实现,总的来说sqlserver更简单些. 测试例子如下: create table ...

  8. Oracle Update 语句语法与性能分析 - 多表关联

    Oracle Update 语句语法与性能分析 - 多表关联   为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create ...

  9. Oracle SQL性能优化 - 根据大表关联更新小表

    需求: 小表数据量20w条左右,大表数据量在4kw条左右,需要根据大表筛选出150w条左右的数据并关联更新小表中5k左右的数据. 性能问题: 对筛选条件中涉及的字段加index后,如下常规的updat ...

随机推荐

  1. 【海量干货】89页PPT详解微信O2O行业解决方案

    根据腾讯大讲堂提供的信息,整理成了PPT,下载地址: http://yunpan.cn/cZAbTnJXnMymd  访问密码 f36d

  2. MFC学习(三):项目学习

    1. 概述 MFC程序由CWinApp.MainFrm(含Menu,可用CSplitterWndEx分割).众多Dialog等组成. MFC既可以使用纯Dialog的形式,也可以使用Document+ ...

  3. [HNOI2010] 合唱队

    题目链接:https://www.luogu.org/problemnew/show/P3205 一个区间DP的题目. 设计状态为:\(dp1[i][j]\)表示当前区间为\([i,j]\),而且最后 ...

  4. 使用docker部署java项目

    在接触了docker后,干什么都想用docker来弄.最近刚做完毕业设计,本来是说将项目简单在本地部署就行了,结果老师说如果部署在服务器的话有加加分,于是果断用docker来搞,多加点分. java项 ...

  5. ocp题库更新,052最新考试题及答案整理-31

    31.Which two events always request the LGWR to write? A) when LGWR is notified by a server process t ...

  6. “全栈2019”Java第三十六章:类

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. Linux centos 6.4安装

    Linux系统安装: 开启虚拟机: 界面说明:Install or upgrade an existing system 安装或升级现有的系统install system with basic vid ...

  8. [Swift]在Swift中实现自增(++)、自减(--)运算符:利用extension扩展Int类

    自增(++).自减(--)运算符主要用在For循环中,Swift有自己更简易的循环遍历方法,而且类似x- ++x这种代码不易维护. Swift为了营造自己的编码风格,树立自己的代码精神体系,已经不支持 ...

  9. codis__简介

    参考文档 https://github.com/wandoulabs/codis 中文简介 https://github.com/wandoulabs/codis/blob/master/doc/tu ...

  10. h5聊天工具的开发过程及思路

    这个产品的主要技术栈有,网易nim即时通信,vue-cli,muse-ui 1.在拿到这个需求时,脑袋里空的,什么想法都没有,完全懵逼,进了网易云通信的官网api查看,由于我做的是客户端的,所以重点看 ...