【发布时间】:2012-06-10 15:44:11
【问题描述】:
我有一个如下所示的更新语句,它工作正常,我在子查询中使用了一个 with 语句来大大提高性能,但由于某种原因,我不允许从同一个表中添加一个额外的列来更新。
作品:
UPDATE Table_A SET (Col_One) = (WITH OneValue AS (SELECT DISTINCT t.Col_One
FROM Table_Two t, Table_A a
WHERE t.id = a.New_Id))
SELECT Col_One FROM OneValue);
我想要做的只是包含另一个列,也像这样从 table_two 更新
UPDATE Table_A SET (Col_One, Col_Two) = (WITH OneValue AS (SELECT DISTINCT t.Col_One, T.Col_two
FROM Table_Two t, Table_A a
WHERE t.id = a.New_Id))
SELECT Col_One, Col_Two FROM OneValue);
但我得到 ora-01767 更新集表达式必须是子查询。我理解这个错误,但看不到我是如何生成它的。非常感谢任何帮助。
提前致谢。
【问题讨论】:
-
我看不出有任何理由说明性能会受益于子查询分解子句。检查执行计划,看看是否有差异。
-
作为编码新手,我不确定我能否正确回答你,只是说我在表 2 的性能方面遇到了问题,这是一个非常大的表。我环顾四周,通过 askTom [link](asktom.oracle.com/pls/asktom/…) 发现了一些非常有用的更新优化信息,将其应用于我的情况,性能从 > 5 分钟变为
-
+1 用于查看 asktom,但-1 用于不遵循那里公开的理念 :) 看看他是如何进行性能比较的。使用 DBMS_Xplan 获取查询的执行计划并查找差异,并注意从数据缓存中受益的第二个查询
标签: sql oracle oracle11g sql-update