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 中做?谢谢!
更新
感谢 Cybernate 和 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 更新加入?的主要内容,如果未能解决你的问题,请参考以下文章