PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:come aggiornare le righe in CTE

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.