with cte as(
select ....... from aTable
),update_cte as(
update cte set aField=(select somthing from cte1)
)
Dat kun je niet doen.
Een UPDATE
mag niet verwijzen naar een CTE-term in PostgreSQL, omdat CTE's worden gematerialiseerd. Het zijn niet alleen weergaven van de onderliggende gegevens. (Dat is soms heel vervelend, maar zo is het).
U kunt:
CREATE TEMPORARY VIEW someview AS SELECT ... FROM atable;
UPDATE someview SET afield = ...
als je wil; die werken op nieuwere PostgreSQL-versies die automatisch bijwerkbare weergaven ondersteunen. Ik denk dat 9.2 dat wel doet.
Anders denk ik dat je iets wilt als:
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 *;
maar echt, niet doen noem uw CTE-voorwaarden cte
, cte1
, enz. Geef ze nuttige, beschrijvende namen die u vertellen wat ze zijn. Het is net als programma's vol variabelen met de naam a
via x
... de volgende persoon die uw code moet onderhouden, of iemand die u om hulp vraagt, niet vind het leuk.