【问题标题】:Why can't I update more than one column at the same time using With keyword?为什么我不能使用 With 关键字同时更新多个列?
【发布时间】: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


【解决方案1】:

这似乎可行(无论如何,它都是使用 DUAL 进行简单查询):

UPDATE Table_A SET (Col_One, Col_Two) = (select col_one, col_two from
                                          (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)
                                        );

至于子查询以“WITH”开头为什么不起作用,我只能想象是因为Oracle SQL的设计者没有预料到这种用法。

【讨论】:

  • 此解决方法有效。谢谢你这么快回答。虽然它确实让我觉得不必要地多余,但我对此很陌生,我不禁想知道它是否有一些合乎逻辑的原因。
  • 感谢您的精彩回答!我被同样的问题难住了,开始变得非常沮丧。仍然不确定它为什么有效,但至少它有效! :)
猜你喜欢
  • 2022-11-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-07
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2010-12-28
相关资源
最近更新 更多