微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL:如何在CTE中更新行

我正在运行Postgresql 9.2.
下面给出的是我巨大而丑陋的样本
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

我需要创建一个包含最终结果的视图.

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

ERROR:  relation "cte" does not exist

我知道我在做一些坏事.你可以理解我在上面的查询中想要实现的目标.
所以请为它提出任何替代方法.

回复非常感谢.

注意:the actual query

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术语称为cte,cte1等.给他们提供有用的描述性名称,告诉您它们是什么.这就像程序中充满了名为a x的变量……下一个必须维护代码的人,或者你要求帮助的任何人,都不会喜欢它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐