Oracle-Update多表关联_第1页
Oracle-Update多表关联_第2页
Oracle-Update多表关联_第3页
Oracle-Update多表关联_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一条 Update 更新语句是不能更新多张表的,除非使用触发器隐含更新。而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据。我们先来讨论根据其他表数据更新你要更新的表一、MSSQLServer 多表关联更新sqlserver提供了update的from子句, 可以将要更新的表与其它的数据源连接起来。虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update 的表达式中引用要更新的表以外的其它数据。一般形式:updateASET 字段 1=8 表字段表达式, 字段 2=B 表字段表达式 fromBWHERE 逻辑表达式例如:UPDATEdbo.T

2、able2SETdbo.Table2.ColB=dbo.Table2.ColB+dbo.Table1.ColBFROMdbo.Table2INNERJOINdbo.Table1ON(dbo.Table2.ColA=dbo.Table1.ColA);实际更新的操作是在要更新的表上进行的,而不是在 from 子句所形成的新的结果集上进行的二、Oracle 多表关联更新Oracle 没有 updatefrom 语法,可以通过两种实现方式:1、利用子查询:updateASET 字段 1=(select 字段表达式 fromBWHERE.),字段 2=(select 字段表达式 fromBWHERE.)

3、WHERE 逻辑表达式UPDAT 多个字段两种写法:写法一:UPDATEtable_1aSETcol_x1=(SELECTb.col_y1,b.col_y2FROMtable_2bWHEREb.col_n=a.col_m),col_x2=(SELECTb.col_y2FROMtable_2bWHEREb.col_n=a.col_m)WHEREEXISTSELECT*FROMtable_2bWHEREb.col_n=a.col_m)或UPDATEtable_1aSETcol_x1=(SELECTb.col_y1,b.col_y2FROMtable_2bWHEREb.col_n=a.col_m),

4、col_x2=(SELECTb.col_y2FROMtable_2bWHEREb.col_n=a.col_m)WHEREa.col_m=SELECTb.col_nFROMtable_2bWHEREb.col_n=a.col_m)写法二:UPDATEtable_1aSET(col_x1,col_x2)=(SELECTb.col_y1,b.col_y2FROMtable_2bWHEREb.col_n=a.col_m)WHEREEXISTSELECT*FROMtable_2bWHEREb.col_n=a.col_m);或UPDATEtable_1aSET(col_x1,col_x2)=(SELECT

5、b.col_y1,b.col_y2FROMable_2bWHEREb.col_n=a.col_m)WHEREa.col_m=SELECTb.col_nFROMtable_2bWHEREb.col_n=a.col_m)注意:1.对于子查询的值只能是一个唯一值,不能是多值。2. 子查询在绝大多数情况下,最后面的 whereEXISTS 子句是重要的,否则将得到错误的结果。且 whereEXISTS 子句可用另一方法代替,如上。最后的子句是对 a 表被更新记录的限制,如无此句,对于 a 表中某记录,如在 b 表中关联不到对应的记录,则该记录被更新字段将被更新为 null。whereEXISTS 子句

6、就是排除对 a 表中该情况的记录进行更新。2、利用视图:UPDATE(SELECTA.NAMEANAME,B.NAMEBNAMEFROMA,BWHEREA.ID=B.ID)SETANAME=BNAME;注意:1.对于视图更新的限制:如果视图基于多个表的连接, 那么用户更新(update)视图记录的能力将受到限制。 除非 update 只涉及一个表且视图列中包含了被更新的表的整个主键,否则不能更新视图的基表。另外,Oracle 中的 Delete 的 from 子句也没有多表联接的功能,只能通过子查询的方式来做:deletefrom 表 Awhereexists(select*from 表 Bw

7、here 表 A.empid表 B.empid)deletefrom 表 Awhere 表 A.empidin(selectempidfrom 表 B)三、oracle 视图多表更新在。racle 中通常如果视图的数据源来自单表则该视图可以进行更新。而如果视图数据源来自两个以上表时这个视图是不可更新的。但有时候为了操作的方便我们更希望能够对多表视图也进行更新。这时候我们可以通过建立更新触发器来替代该视图原有更新以达到多表更新的效果例如:1.1 创建测试数据表-创建测试表DropTablet1;DropTablet2;createtablet1(t11numeric(28),t12varchar

8、2(20);createtablet2(t11numeric(28),t22varchar2(20);1.2 多表视图范例-创建测试视图createOrReplaceviewtasselectT1.t11f1,T1.t12f2,T2.t22f3fromT1,T2WhereT1.t11=T2.t11;1.3 多表视图触发器范例-创建视图的替代触发器CreateOrReplaceTriggerTrg_InsUpdDel_tInsteadOfInsertorupdateordeleteontforeachrowDeclarebeginIfInsertingThenInsertIntot1(t11,t12)Values(:New.f1,:New.f2);InsertIntot2(t11,t22)Values(:New.f1,:New.f3);elsifUpdatingThenUpdatet1sett11=:New.f1,t12=:New.f2wheret11=:New.f1;Upd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论