PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL :comment mettre à jour des lignes dans CTE

with cte as(
select ....... from aTable
),update_cte as(
update cte set aField=(select somthing from cte1)
)

Vous ne pouvez pas faire ça.

Une UPDATE ne peut pas faire référence à un terme CTE dans PostgreSQL, car les CTE sont matérialisés. Ce ne sont pas seulement des vues sur les données sous-jacentes. (C'est parfois très ennuyeux, mais c'est comme ça).

Vous pouvez :

CREATE TEMPORARY VIEW someview AS SELECT ... FROM atable;

UPDATE someview SET afield = ...

si tu veux; cela fonctionnera sur les nouvelles versions de PostgreSQL qui prennent en charge les vues pouvant être mises à jour automatiquement. Je pense que 9.2 le fait.

Sinon, je pense que vous voulez quelque chose comme :

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 *;

mais vraiment, s'il vous plaît ne le faites pas appelez vos termes CTE cte , cte1 , etc. Donnez-leur des noms utiles et descriptifs qui vous disent ce qu'ils sont. C'est comme des programmes remplis de variables nommées a par x ... la prochaine personne qui devra maintenir votre code, ou toute personne à qui vous demanderez de l'aide, ne le fera pas j'aime bien.