sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL:jak aktualizovat řádky v CTE

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

To nemůžete.

UPDATE nemusí odkazovat na termín CTE v PostgreSQL, protože CTE jsou materializované. Nejsou to jen pohledy na základní data. (To je někdy opravdu nepříjemné, ale je to tak).

Můžete:

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

UPDATE someview SET afield = ...

jestli chceš; to bude fungovat na novějších verzích PostgreSQL, které podporují automaticky aktualizovatelná zobrazení. Myslím, že 9.2 ano.

Jinak si myslím, že chcete něco jako:

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

ale opravdu to prosím nedělej nazvěte své CTE výrazy cte , cte1 , atd. Dejte jim užitečná, popisná jména, která vám řeknou, co to je. Je to jako programy plné proměnných s názvem ax ... další osoba, která musí udržovat váš kód, nebo kdokoli, koho požádáte o pomoc, nebude líbí.




  1. mít příkaz mysql select vrátí plně kvalifikované názvy sloupců jako table.field

  2. Jak se tento výraz CASE dostane do klauzule ELSE?

  3. Používání heterogenních služeb Oracle® se dvěma zdroji dat ODBC

  4. PostgreSQL převede název měsíce na číslo