PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL:So aktualisieren Sie Zeilen in CTE

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.