小编典典

PostgreSQL:如何更新CTE中的行

sql

正在运行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

我知道在做坏事。
希望您能从上述 查询中 了解要实现的目标。
因此,请提出其他替代方法。

非常感谢您的答复。

注意:实际查询


阅读 152

收藏
2021-04-22

共1个答案

小编典典

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

你不能那样做。

一个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等等。给它们提供有用的描述性名称,以告诉您它们的含义。这就像充满命名的变量程序a通过x…你求助旁边的人谁也维护你的代码,或任何人,不会
喜欢它。

2021-04-22