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.