Oracle中的UPDATE FROM解决方法

http://tech.it168.com/db/o/2006-06-28/200606280954219.shtml

 

表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据。象sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来。虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式中引用要更新的表以外的其它数据。

    例如:

  
  
UPDATE dbo.Table2 SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB FROM dbo.Table2 INNER JOIN dbo.Table1 ON (dbo.Table2.ColA = dbo.Table1.ColA);

    实际更新的操作是在要更新的表上进行的,而不是在from子句所形成的新的结果集上进行的。

    Oracle没有update from语法,可以通过两种写法实现同样的功能:

    1:子查询UPDATE A SET A.NAME=(SELECT B.NAME FROM B WHERE B.ID=A.ID),本查询要根据具体情况看看是否变通成如下

  
  
UPDATE A SET A.NAME = ( SELECT B.NAME FROM B WHERE B.ID = A.ID) WHERE A.ID IN ( SELECT ID FROM B);

    2:利用视图来做

  
  
UPDATE ( SELECT A.NAME ANAME,B.NAME BNAME FROM A,B WHERE A.ID = B.ID) SET ANAME = BNAME;

    例如:

  
  
UPDATE tablea a SET a.fieldforupdate = ( SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield) WHERE EXISTS ( SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield)

    有三点需要注意:

    1. 对于一个给定的a.keyfield的值,SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield 的值只能是一个唯一值,不能是多值。

    2. 在绝大多数情况下,最后面的where EXISTS子句是重要的,否则将得到错误的结果。

    3. 对于视图更新的限制:

    如果视图基于多个表的连接,那么用户更新(update)视图记录的能力将受到限制。除非update只涉及一个表且视图列中包含了被更新的表的整个主键,否则不能更新视图的基表。

 
 
 
 
另外一篇外国友人文章:
 

Those with a SqlServer background will be familiar with the UPDATE .. FROM syntax. 

For example (totally made up)

   1: update employee_bonus
   2:    set bonus = 0 
   3:   from employee_bonus b 
   4:  inner join employees e on b.employee_id = e.employee_id
   5:  where e.bonus_eligible = 'N'

Those who transitioned from SqlServer to Oracle might find the absence of the UPDATE FROM a significant loss.  The best Oracle alternative that I know of is as follows.

   1: update (select bonus 
   2:           from employee_bonus b 
   3:          inner join employees e on b.employee_id = e.employee_id 
   4:          where e.bonus_eligible = 'N') t
   5:    set t.bonus = 0

Actually, if you look at it, they are very similar.

In fact Oracle has quite a bit of power in the UPDATE.  Check out this reference.  The syntax in the statement above utilizes the subquery1 block in the diagram below.

Happy coding.
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值