with cte as(
select ....... from aTable
),update_cte as(
update cte set aField=(select somthing from cte1)
)
Non puoi farlo.
Un UPDATE
potrebbe non fare riferimento a un termine CTE in PostgreSQL, poiché i CTE si sono materializzati. Non sono solo visualizzazioni sui dati sottostanti. (A volte è davvero fastidioso, ma è così).
Puoi:
CREATE TEMPORARY VIEW someview AS SELECT ... FROM atable;
UPDATE someview SET afield = ...
se vuoi; funzionerà con le versioni PostgreSQL più recenti che supportano viste aggiornabili automaticamente. Penso che 9.2 lo faccia.
Altrimenti, penso che tu voglia qualcosa come:
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 *;
ma in realtà, per favore non chiama i tuoi termini CTE cte
, cte1
, ecc. Assegna loro nomi utili e descrittivi che ti dicano cosa sono. È come un programma pieno di variabili chiamate a
tramite x
... la prossima persona che deve mantenere il tuo codice, o chiunque tu chieda aiuto, non piace.