sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL:cómo actualizar filas en CTE

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.