zoukankan      html  css  js  c++  java
  • Oracle中的 UPDATE FROM 解决方法

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

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

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

    Oracle没有update from语法,可以通过两种写法实现同样的功能:
    1:子查询UPDATE A SET A.NAME=(SELECT B.NAME FROM B WHERE B.ID=A.ID),本查询要根据具体情况看看是否变通成如下
    (1)单列
    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 order_rollup

    SET(qty,price)=(SELECT SUM(qty),SUM(price) FROM order_lines WHERE customer_id='KOHL' )

    WHERE cust_id='KOHL' AND order_period=TO_DATE('01-Oct-2000')

    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只涉及一个表且视图列中包含了被更新的表的整个主键,否则不能更新视图的基表。
  • 相关阅读:
    es5预览本地文件、es6练习代码演示案例
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 836 矩形重叠(暴力)
    Subversion under Linux [Reprint]
    Subversion how[Reprint]
  • 原文地址:https://www.cnblogs.com/clds/p/6016639.html
Copyright © 2011-2022 走看看