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)
我知道我做的很糟糕.
希望你能从上面的查询中了解到我想要实现的目标.
所以请为它提出任何替代方法.
回复非常感谢.
注意:实际查询
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术语cte
,cte1
等等。给它们提供有用的描述性名称,以告诉您它们的含义。这就像充满命名的变量程序a
通过x
...你求助旁边的人谁也维护你的代码,或任何人,不会不喜欢它。
归档时间: |
|
查看次数: |
2341 次 |
最近记录: |