欢迎来到天天文库
浏览记录
ID:40751854
大小:17.53 KB
页数:5页
时间:2019-08-07
《Oracle -Update 多表关联》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新。而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据。我们先来讨论根据其他表数据更新你要更新的表 一、MS SQL Server 多表关联更新 sqlserver提供了update的from子句,可以将要更新的表与其它的数据源连接起来。虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式中引用要更新的表以外的其它数据。 一般形式:updateASET字段1=B表字段
2、表达式,字段2=B表字段表达式 fromBWHERE 逻辑表达式例如: UPDATEdbo.Table2 SETdbo.Table2.ColB=dbo.Table2.ColB+dbo.Table1.ColB FROMdbo.Table2 INNERJOINdbo.Table1 ON(dbo.Table2.ColA=dbo.Table1.ColA); 实际更新的操作是在要更新的表上进行的,而不是在from子句所形成的新的结果集上进行的二、Oracle 多表关联更新 Oracle没
3、有updatefrom语法,可以通过两种实现方式:1、利用子查询: update A SET 字段1=(select 字段表达式 from B WHERE ...), 字段2=(select 字段表达式 from B WHERE ...) WHERE 逻辑表达式 UPDATE多个字段两种写法:写法一:UPDATEtable_1a SETcol_x1=(SELECTb.col_y1,b.col_y2FROMtable_2
4、bWHEREb.col_n=a.col_m), col_x2=(SELECTb.col_y2FROMtable_2bWHEREb.col_n=a.col_m)WHEREEXISTS(SELECT*FROMtable_2bWHEREb.col_n=a.col_m)或UPDATEtable_1a SETcol_x1=(SELECTb.col_y1,b.col_y2FROMtable_2bWHEREb.col_n=a.col_m), col_x2=(SELECTb.col_y2FROMtable_2bW
5、HEREb.col_n=a.col_m)WHEREa.col_m=(SELECTb.col_nFROMtable_2bWHEREb.col_n=a.col_m)写法二:UPDATEtable_1a SET(col_x1,col_x2)=(SELECTb.col_y1,b.col_y2FROMtable_2bWHEREb.col_n=a.col_m)WHEREEXISTS(SELECT*FROMtable_2bWHEREb.col_n=a.col_m);或UPDATEtable_1a SET(col_x1,col_x
6、2)=(SELECTb.col_y1,b.col_y2FROMtable_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表
7、中关联不到对应的记录,则该记录被更新字段将被更新为null。whereEXISTS子句就是排除对a表中该情况的记录进行更新。2、利用视图:UPDATE(SELECTA.NAMEANAME,B.NAMEBNAMEFROMA,BWHEREA.ID=B.ID)SETANAME=BNAME; 注意: 1.对于视图更新的限制: 如果视图基于多个表的连接,那么用户更新(update)视图记录的能力将受到限制。除非update只涉及一个表且视图列中包含了被更新的表的整个主键,否则不能更新视图的基表。另外,Oracle中的D
8、elete的from子句也没有多表联接的功能,只能通过子查询的方式来做:deletefrom表Awhereexists(select*from表Bwhere表A.empid=表B.empid)deletefrom表Awhere表A.empidin(selectempidfrom表B)三、oracle视图多表更新在oracle中通常
此文档下载收益归作者所有