with cte as(
select ....... from aTable
),update_cte as(
update cte set aField=(select somthing from cte1)
)
Det kan du inte göra.
En UPDATE
får inte referera till en CTE-term i PostgreSQL, eftersom CTE:er materialiseras. De är inte bara vyer över underliggande data. (Det är ibland riktigt irriterande, men det är så det är).
Du kan:
CREATE TEMPORARY VIEW someview AS SELECT ... FROM atable;
UPDATE someview SET afield = ...
om du vill; som kommer att fungera på nyare PostgreSQL-versioner som stöder automatiskt uppdateringsbara vyer. Jag tror att 9.2 gör det.
Annars tror jag att du vill ha något i stil med:
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 *;
men verkligen, snälla gör inte kalla dina CTE-villkor cte
, cte1
, etc. Ge dem användbara, beskrivande namn som berättar vad de är. Det är som program fulla av variabler som heter a
genom x
... nästa person som måste underhålla din kod, eller någon du ber om hjälp, inte gillar det.