PostgreSQL:如何在CTE中更新行

6 sql postgresql common-table-expression

我正在跑步PostgreSQL 9.2.
下面给出的是我巨大而丑陋的样本query

with cte as(
select ....... from aTable 
),cte1 as (
select ..... from bTable inner join cte using(anID)
),update_cte as(
update cte set aField=(select somthing from cte1)
)
select * from cte
Run Code Online (Sandbox Code Playgroud)


我需要创建一个view最终结果.

执行上述操作时会出现以下错误.

ERROR:  relation "cte" does not exist
Run Code Online (Sandbox Code Playgroud)

我知道我做的很糟糕.
希望你能从上面的查询中了解到我想要实现的目标.
所以请为它提出任何替代方法.

回复非常感谢.

注意:实际查询

Cra*_*ger 5

with cte as(
select ....... from aTable
),update_cte as(
update cte set aField=(select somthing from cte1)
)
Run Code Online (Sandbox Code Playgroud)

你不能那样做。

一个UPDATE可以不引用PostgreSQL中CTE来看,由于热膨胀系数被物化。它们不仅是基础数据的视图。(有时确实很烦人,但事实就是这样)。

您可以:

CREATE TEMPORARY VIEW someview AS SELECT ... FROM atable;

UPDATE someview SET afield = ...
Run Code Online (Sandbox Code Playgroud)

如果你想; 可以在支持自动更新视图的新PostgreSQL版本上使用。我认为9.2可以。

否则,我认为您想要的是:

WITH cte1 as (
  select ..... from bTable inner join cte using(anID)
)
update aTable 
set aField=(select somthing from cte1)
WHERE ... where clause from cte ...
RETURNING *;
Run Code Online (Sandbox Code Playgroud)

但实际上,请不要称呼您的CTE术语ctecte1等等。给它们提供有用的描述性名称,以告诉您它们的含义。这就像充满命名的变量程序a通过x...你求助旁边的人谁也维护你的代码,或任何人,不会喜欢它。