with cte as(
select ....... from aTable
),update_cte as(
update cte set aField=(select somthing from cte1)
)
Das geht nicht.
Ein UPDATE
darf in PostgreSQL nicht auf einen CTE-Begriff verweisen, da CTEs materialisiert sind. Sie sind nicht nur Ansichten über die zugrunde liegenden Daten. (Das ist manchmal echt nervig, aber so ist es).
Sie können:
CREATE TEMPORARY VIEW someview AS SELECT ... FROM atable;
UPDATE someview SET afield = ...
falls Sie es wollen; das funktioniert auf neueren PostgreSQL-Versionen, die automatisch aktualisierbare Ansichten unterstützen. Ich denke, 9.2 tut es.
Ansonsten denke ich, dass Sie so etwas wollen:
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 *;
aber wirklich, bitte nicht Nennen Sie Ihre CTE-Begriffe cte
, cte1
usw. Geben Sie ihnen nützliche, aussagekräftige Namen, die Ihnen sagen, was sie sind. Es ist wie Programme voller Variablen namens a
durch x
... die nächste Person, die Ihren Code pflegen muss, oder jeder, den Sie um Hilfe bitten, wird es nicht tun mag es.