PL/SQL 更新加入?

Posted

技术标签:

【中文标题】PL/SQL 更新加入?【英文标题】:PL/SQL Update Join? 【发布时间】: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 分钟后终止了我的进程。)

【问题讨论】:

【参考方案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 您是否使用了完全相同的查询?您的联接是否基于表的主键?)

以上是关于PL/SQL 更新加入?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PL/sql 函数进行 SQL 更新

更新期间PL/SQL编译错误

PL/SQL 触发器更新或删除

PL/SQL 更新当前的

更新/删除不存在的行时的 PL/SQL 异常

PL/SQL 触发器和多次更新