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

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

$ sqlplus user/pass 

SQL*Plus: Release 9.2.0.6. - Production on Wed Aug  ::  

Copyright (c) , , Oracle Corporation.  All rights reserved. 

 Connected to:
Oracle9i Enterprise Edition Release 9.2.0.6. - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.6. - Production SQL> select * from wwm2; --要更新的表 TOWN ID
-------------------- ---------- ww'jj 111
llll
dddd
lllldf
lllldf
dsafdf ljjjjj
dsafdf TOWN ID
-------------------- ---------- ljjjjj SQL> select * from wwm5; --更新的条件表 TOWN ID
-------------------- ----------
lllldf
test SQL> select wwm2.* from wwm2,wwm5 where wwm2.id=wwm5.id
/ TOWN ID
-------------------- ---------- ww'jj 111
lllldf
lllldf
dsafdf dsafdf rows selected. 所以,每次需要更新8条数据就是正确的. 相信程序员是通过以下类似的SQL更新的,这是错误的,因为没有加WHERE
SQL> update wwm2 set wwm2.town=(select wwm5.town from wwm5 where wwm5.id=wwm2.id)
/ rows updated. SQL> select * from wwm2; TOWN ID
-------------------- ---------- lllldf
lllldf lllldf
lllldf
lllldf
lllldf lllldf TOWN ID
-------------------- ----------
lllldf rows selected. 可以看到13条记录被更新,符合条件的更新正确,不符合条件的也更新为NULL.以下是正确的方法 方法一:
SQL> update wwm2
set town=(select town from wwm5 where wwm5.id=wwm2.id)
where id=(select wwm5.id from wwm5 where wwm5.id=wwm2.id)
/ rows updated. 方法二: 与方法一道理相同,这里需要掌握EXIST的相关用法.
SQL> update wwm2
set town=(select town from wwm5 where wwm5.id=wwm2.id)
where exists (select from wwm5 where wwm5.id=wwm2.id)
rows updated. 方法三:
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)
set atown=btown
/
set atown=btown
*
ERROR at line :
ORA-: cannot modify a column which maps to a non key-preserved table * alter table wwm5 add primary key (id)
SQL> / Table altered. update (select a.town atown,a.id aid,b.town btown,b.id bid from wwm2 a,wwm5 b where a.id=b.id)
* set atown=btown
SQL> / rows updated. 这种方法的局限性就是需要PRIMARY 的支持. 方法四:
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;
SQL> / PL/SQL procedure successfully completed. SQL> select * from wwm2; TOWN ID
-------------------- ---------- lllldf
lllldf
llll
dddd
lllldf
lllldf
lllldf
lllldf
ljjjjj
lllldf TOWN ID
-------------------- ----------
lllldf
ljjjjj 这个方法是最灵活的了. 方法五: 注意,方法五只能适用于WWM5是WWM2的子集的时候.
merge into wwm2
using (select town,id from wwm5) b
on (wwm2.id=b.id)
when matched then update set town=b.town
* when not matched then insert (town,id) values (null,null)
SQL> / rows merged. SQL> select * from wwm2; TOWN ID
-------------------- ----------
---注意这个地方,被插入了一个空值.因为WWM5的ID=9984在WWM2中不能匹配,根本原因是ORACLE9必须有WHEN NOT MATCHED子句,但是ORACLE10可以不许要,也就是ORACLE10可以不写WHEN NOT MATCHED ,就不必插入NULL值了,为解决这个问题,下一步会DELETE WWM5的ID=,这样一来就不会执行WHEN NOT MATCHED lllldf
lllldf
llll
dddd
lllldf
lllldf
lllldf
lllldf
ljjjjj TOWN ID
-------------------- ----------
lllldf
lllldf
ljjjjj rows selected. SQL> delete from wwm5 where id=; row deleted. SQL> merge into wwm2
SQL> using (select town,id from wwm5) b
SQL> on (wwm2.id=b.id)
SQL> when matched then update set town=b.town
SQL> * when not matched then insert (town,id) values (null,null)
SQL> / rows merged. 以上就是5种关连更新的例子了,希望能给开发人员解惑. 说明:如果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. sharepoint 2010 GetUserProfileByName 5566

    After some further investigation i found that it's actually the "ASP.NET Impersonation" th ...

  2. iOS开发其他相关

    1.iOS开发行情 1.1 iOS系统各个版本的占比查询 2.Xcode的使用 开发软件下载 Xcode Help(官方) 2.1 Xcode面板 Xcode面板 2.2 Xcode版本新功能 Xco ...

  3. linux 修改主机名 【root@主机名 ~】

    centos 7修改方式: hostnamectl  set-hostname   hostuser reboot 或者直接vi /etc/hostname 添加内容: hostuser 检查修改效果 ...

  4. python index()函数

    python内置index()函数 index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与 python ...

  5. Redis数据持久化,安全

    一.redis数据持久化 由于redis是一个内存数据库,如果系统遇到致命问题需要关机或重启,内存中的数据就会丢失,这是生产环境所不能允许的.所以redis提供了数据持久化的能力. redis提供了两 ...

  6. 重置root密码

    一. ubuntu忘记密码解决方法 1. 开机按shift 2. 选择高级选项,进入后选择恢复模式(不要按回车),按e进入编辑模式 3. 修改linux命令中的recovery nomodest 为 ...

  7. 从零开始用 Flask 搭建一个网站(四)

    前言 从零开始用 Flask 搭建一个网站(三) 介绍了网页前端与后端.前端与前端之间数据的交流.本节主要介绍一下如何应用 Flask-OAuthlib, 使用 Flask-OAuthlib 就可以轻 ...

  8. PyQt5(3)——信号和槽初探

    信号和槽是QT的核心机制(当信号发射时,链接的槽函数会自动执行) 在pyqt5中信号和槽通过 QObject.signal.connect()链接. QObject类或子类(QWidget)派生的类都 ...

  9. SpringBoot 启动的时候提示 Field *** in *** required a bean named 'entityManagerFactory' that could not be found.

    错误截图 后面发现原来和入口类代码有关. //@SpringBootApplication(scanBasePackages = {"org.jzc.odata.cboard",& ...

  10. css样式之标签的查找

    css的组成部分:选择器和声明 css的注释: /*这是注释*/ <!DOCTYPE html> <html lang="zh-CN"> <head& ...