我有两个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_1
。merge
可能是一个不错的选择:
MERGE INTO table_1 a
USING table_2 b
ON (a.id = b.id)
WHEN MATCHED
THEN
UPDATE SET a.y = b.y;
好吧,我明白其中有一些"复杂的逻辑"。涉及到,所以查询可能需要修改,但是-这是一般的想法。