sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:rijen bijwerken in CTE

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

Dat kun je niet doen.

Een UPDATE mag niet verwijzen naar een CTE-term in PostgreSQL, omdat CTE's worden gematerialiseerd. Het zijn niet alleen weergaven van de onderliggende gegevens. (Dat is soms heel vervelend, maar zo is het).

U kunt:

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

UPDATE someview SET afield = ...

als je wil; die werken op nieuwere PostgreSQL-versies die automatisch bijwerkbare weergaven ondersteunen. Ik denk dat 9.2 dat wel doet.

Anders denk ik dat je iets wilt als:

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

maar echt, niet doen noem uw CTE-voorwaarden cte , cte1 , enz. Geef ze nuttige, beschrijvende namen die u vertellen wat ze zijn. Het is net als programma's vol variabelen met de naam a via x ... de volgende persoon die uw code moet onderhouden, of iemand die u om hulp vraagt, niet vind het leuk.




  1. SQL Server standaard datum tijdstempel?

  2. Machtigingen verlenen aan een MySQL-gebruiker op Linux via de opdrachtregel

  3. Krijgt u het aantal rijen ingevoegd voor ON DUPLICATE KEY UPDATE meerdere inserts?

  4. Hoe kan ik het aantal berichten tellen?