PostgreSQL:如何在CTE中更新行

时间:2014-08-18 05:04:52

标签: 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


我需要使用最终结果创建view

执行上述操作时出现错误,如下所示。

ERROR:  relation "cte" does not exist

我知道我做的事情很糟糕。
希望你能从上面的查询中理解我想要实现的目标。
因此,请为其提出任何替代方法。

非常感谢回复。

注意:the actual query

1 个答案:

答案 0 :(得分:4)

with cte as(
select ....... from aTable
),update_cte as(
update cte set aField=(select somthing from cte1)
)

你不能这样做。

由于CTE具体化,UPDATE可能无法在PostgreSQL中引用CTE术语。它们不仅仅是对底层数据的看法。 (这有时真的很烦人,但那是怎么回事。)

你可以:

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

UPDATE someview SET afield = ...

如果你想;这将在支持自动可更新视图的较新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 *;

但实际上,请不要拨打您的CTE条款ctecte1等。为他们提供有用的描述性名称,告诉您它们是什么。它就像程序中充满了名为ax的变量......下一个必须维护代码的人,或者你要求帮助的任何人,都喜欢它。