如何在oracle中更新一个CTE与另一个CTE的列



我有两个CTE假设是A和B,我想用CTE B更新A的一列。

WITH cte_A AS ( SELECT X, 0 AS Y from table_1 -- Some complex logic for Y that is why updating with other CTE )
UPDATE cte_A  SET Y = (
WITH CTE_B AS (SELECT Y FROM table_2 )
SELECT Y FROM CTE_B WHERE CTE_B.ID =  cte_A.ID
)
SELECT * FROM cte_A 

我得到错误,如缺少SELECT关键字在oracle

您不能UPDATE查询;您可以UPDATE一个表(或视图)。然而,你不需要更新它,你只需要显示数据来自两个来源。

您可以做的是使用JOIN这两个表,而不是从CTE_A中选择*,从CTE_B中选择Y,从CTE_A中选择其他列(并且考虑到您的逻辑,您似乎正在使用OUTER JOIN):

WITH cte_A (id, x, y) AS (
SELECT id, x, 0 from table_1
),
CTE_B (id, y) AS (
SELECT id, y FROM table_2
)
SELECT a.id,
a.x,
b.y
FROM   CTE_A a
LEFT OUTER JOIN CTE_B b
ON b.ID =  a.ID

你不能;CTE只是编写子查询的另一种方式。你不能更新子查询;你更新表(在大多数情况下),很少更新视图,但子查询-不。

在您的情况下,您实际上要更新table_1merge可能是一个不错的选择:

MERGE INTO table_1 a
USING table_2 b
ON (a.id = b.id)
WHEN MATCHED
THEN
UPDATE SET a.y = b.y;

好吧,我明白其中有一些"复杂的逻辑"。涉及到,所以查询可能需要修改,但是-这是一般的想法。

最新更新