sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL:hvordan man opdaterer rækker i CTE

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

Det kan du ikke.

En UPDATE refererer muligvis ikke til et CTE-udtryk i PostgreSQL, da CTE'er bliver til. De er ikke kun visninger af de underliggende data. (Det er nogle gange virkelig irriterende, men sådan er det).

Du kan:

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

UPDATE someview SET afield = ...

Hvis du vil; der fungerer på nyere PostgreSQL-versioner, der understøtter automatisk opdateringsmuligheder. Det tror jeg, 9.2 gør.

Ellers tror jeg, du vil have noget som:

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 virkelig, lad være kald dine CTE-vilkår cte , cte1 osv. Giv dem brugbare, beskrivende navne, der fortæller dig, hvad de er. Det er ligesom programmer fulde af variabler ved navn a gennem x ... den næste person, der skal vedligeholde din kode, eller nogen du beder om hjælp, vil ikke kan lide det.




  1. Udløs før sletning af MySql

  2. SQL:Hvordan kan jeg få værdien af ​​en attribut i XML-datatype?

  3. Registrering af låste borde (låst af LOCK TABLE)

  4. Oracle Vælg Where Date Between Today