【问题标题】:PL/SQL Update Join?PL/SQL 更新加入?
【发布时间】:2011-07-26 00:44:28
【问题描述】:

我知道 PL/SQL 中没有 Update-Join 语句。我以前写过T-SQL。

我有两张桌子。

Alex_Table1
---------------------------
PK         VAL
---------------------------
1          Value1
2          Value2
3          Value3


Alex_Table2
---------------------------
PK         VAL
---------------------------
1          Value1_2
3          Value3_2

我想将 VAL 从 Alex_Table2 更新为 Alex_Table1 通过 PK 列加入。

在 T-SQL 中,这很简单

update t1 set t1.VAL = t2.VAL
from
    Alex_Table1 t1
    inner join Alex_Table2 t2 on t1.PK = t2.PK;

结果如我所愿

Alex_Table1
---------------------------
PK         VAL
---------------------------
1          Value1_2
2          Value2
3          Value3_2

我的问题是如何在 PL/SQL 中做?谢谢!

更新

感谢 Cyber​​nate 和 ypercube 给了我两个有用的解决方案。他们都工作。但是,我想让你知道这两个语句之间的性能。

我的实际表包含 80,000 条记录,只有 3,000 条需要更新。

MERGE 语句耗时 0.533 秒。

UPDATE EXISTS 语句耗时超过 3 分钟(我没有测量实际时间。我在 3 分钟后终止了我的进程。)

【问题讨论】:

    标签: join plsql


    【解决方案1】:

    使用 MERGE 语句:

    MERGE INTO Alex_Table1 t1
    USING Alex_Table2 t2
    ON (t1.PK = t2.PK)
    WHEN MATCHED THEN 
    UPDATE SET t1.VAL = t2.VAL
    

    【讨论】:

    • 哇!
    • 我还有一个问题。在我目前的情况下,更新语句只涉及两个表。如果更新语句涉及两个以上的表,我可以使用 MERGE 语句吗?
    • 您可以使用任何有效的查询来代替上述查询中的 Alex_Table2。查看此链接了解更多信息:psoug.org/reference/merge.html
    【解决方案2】:
    UPDATE Alex_Table1 t1
    SET t1.VAL =
          ( SELECT t2.VAL 
            FROM Alex_Table2 t2
            WHERE t2.PK = t1.PK
          )
    WHERE EXISTS
            ( SELECT *
              FROM Alex_Table2 t2
              WHERE t2.PK = t1.PK
            )
    

    这也有效(只要(PK)Alex_Table2 的主键):

    UPDATE
      ( SELECT t1.VAL A, t2.VAL B
        FROM Alex_Table1 t1
          JOIN Alex_Table2 t2
            ON t2.PK = t1.PK
      )
    SET A = B ;
    

    dbfiddle.uk 测试。

    【讨论】:

    • @Alex:也看看第二种方式。由于您熟悉 JOIN,因此将更新扩展到 2 个以上的表应该很容易。
    • 抱歉,您的第二条语句不起作用。错误信息是SQL Error: ORA-00904: "T2"."VAL": invalid identifier
    • @Alex:你现在可以试试吗?我现在没有可供测试的 Oracle 机器。
    • 它仍然无法正常工作。错误信息是SQL Error: ORA-01779: cannot modify a column which maps to a non key-preserved table
    • @RachSharp 您是否使用了完全相同的查询?您的联接是否基于表的主键?)
    猜你喜欢
    • 2012-05-23
    • 1970-01-01
    • 2015-10-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多