Oracle中的UPDATE FROM解决方法

转载 2012年03月30日 09:54:31

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只涉及一个表且视图列中包含了被更新的表的整个主键,否则不能更新视图的基表。

 
 
 
 
另外一篇外国友人文章:
http://geekswithblogs.net/WillSmith/archive/2008/06/18/oracle-update-with-join-again.aspx
 

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.
 

相关文章推荐

Oracle中的 UPDATE FROM 解决方法

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

Oracle_Update...Set...From...解决方法Merge Into...Using...

Oracle_Update...Set...From...解决方法Merge Into...Using...

Oracle中的 UPDATE FROM 解决方法

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

Oracle中的UPDATE FROM解决方法

http://tech.it168.com/db/o/2006-06-28/200606280954219.shtml 今天又碰到了这个问题,在Oracle中没有update from这样的语法,但...

kali apt-get update失败解决方法

apt-get update ->”Hash Sum mismatch“ 原来是因为url被墙了,要翻墙解决

Meteor update等操作失败原因及解决方法

Meteor 提供了两个 MongoDB 数据库:一个客户端缓存数据库和服务器上的一个 MongoDB 数据库。当一个用户更改一些数据时(例如通过单击 Save),在浏览器中运行的 JavaScrip...

OAF学习笔记-18- Update后页面显示不是最新的数据的解决方法

不知道遇没遇到这种情况,我是遇到了.(应该哪里没有设置属性,或是别的)于是自己做了个不靠谱的方法.已解决问题 思路:在更新时,获取到查询条件值,并将条件值写入AM中,Update后跳转回查询页面...

Hibernate_should be mapped with insert="false" update="false"的解决方法

今天在配置hibernate 单向多对一映射时出现了启动异常,第一句末尾出现了should be mapped with insert="false" update="false"提示 原因是存在账...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)