sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL:hur man uppdaterar rader i CTE

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

Det kan du inte göra.

En UPDATE får inte referera till en CTE-term i PostgreSQL, eftersom CTE:er materialiseras. De är inte bara vyer över underliggande data. (Det är ibland riktigt irriterande, men det är så det är).

Du kan:

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

UPDATE someview SET afield = ...

om du vill; som kommer att fungera på nyare PostgreSQL-versioner som stöder automatiskt uppdateringsbara vyer. Jag tror att 9.2 gör det.

Annars tror jag att du vill ha något i stil med:

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

men verkligen, snälla gör inte kalla dina CTE-villkor cte , cte1 , etc. Ge dem användbara, beskrivande namn som berättar vad de är. Det är som program fulla av variabler som heter a genom x ... nästa person som måste underhålla din kod, eller någon du ber om hjälp, inte gillar det.




  1. Postgres:Ordna efter strängkolumn med kända värden

  2. Hur man sammanfogar två tabeller där en av dem inte har en primärnyckel och inte har samma teckenlängd

  3. PHP kan inte ansluta till mysql via python

  4. MySQL WHERE NOT IN extremt långsam