我有一个下面显示的更新语句工作正常,我在子查询中使用了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更新集表达式必须是子查询。我理解这个错误,但没看到我是如何生成它的。非常感谢任何帮助。
提前致谢。
答案 0 :(得分:9)
这似乎有效(无论如何使用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的设计者没有预料到这种用法。