with cte as(
select ....... from aTable
),update_cte as(
update cte set aField=(select somthing from cte1)
)
No puedes hacer eso.
Una UPDATE
no puede hacer referencia a un término CTE en PostgreSQL, ya que se materializan los CTE. No son solo vistas sobre los datos subyacentes. (Eso a veces es realmente molesto, pero así son las cosas).
Puedes:
CREATE TEMPORARY VIEW someview AS SELECT ... FROM atable;
UPDATE someview SET afield = ...
si tu quieres; eso funcionará en las versiones más nuevas de PostgreSQL que admiten vistas actualizables automáticamente. Creo que 9.2 sí.
De lo contrario, creo que quieres 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 *;
pero de verdad, por favor no llame a sus términos CTE cte
, cte1
, etc. Déles nombres útiles y descriptivos que le digan qué son. Son como programas llenos de variables llamadas a
a través de x
... la próxima persona que tenga que mantener su código, o cualquier persona a la que le pida ayuda, no Me gusta.