with cte as(
select ....... from aTable
),update_cte as(
update cte set aField=(select somthing from cte1)
)
Você não pode fazer isso.
Uma
UPDATE
não pode fazer referência a um termo CTE no PostgreSQL, pois os CTEs são materializados. Eles não são apenas visualizações sobre os dados subjacentes. (Isso às vezes é muito chato, mas é assim que é). Você pode:
CREATE TEMPORARY VIEW someview AS SELECT ... FROM atable;
UPDATE someview SET afield = ...
Se você quiser; que funcionará em versões mais recentes do PostgreSQL que suportam visualizações automaticamente atualizáveis. Acho que 9.2 sim.
Caso contrário, acho que você quer algo como:
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 *;
mas realmente, por favor não chame seus termos de CTE
cte
, cte1
, etc. Dê a eles nomes úteis e descritivos que digam o que são. É como programas cheios de variáveis chamadas a
através de x
... a próxima pessoa que tiver que manter seu código, ou qualquer pessoa a quem você peça ajuda, não gosto disso.