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

Vejledning i brug af WITH-sætningen i SQL

Hvis der kan være samtidig skriveadgang til involverede tabeller er der raceforhold i følgende forespørgsler. Overvej:

Dit eksempel kan brug et CTE (fælles tabeludtryk), men det vil ikke give dig noget, en underforespørgsel ikke kunne gøre:

WITH x AS (
   SELECT  psp_id
   FROM    global.prospect
   WHERE   status IN ('new', 'reset')
   ORDER   BY request_ts
   LIMIT   1
   )
UPDATE global.prospect psp
SET    status = status || '*'
FROM   x
WHERE  psp.psp_id = x.psp_id
RETURNING psp.*;

Den returnerede række vil være den opdaterede version.

Hvis du vil indsætte den returnerede række i en anden tabel, det er her en WITH klausul bliver væsentlig:

WITH x AS (
   SELECT  psp_id
   FROM    global.prospect
   WHERE   status IN ('new', 'reset')
   ORDER   BY request_ts
   LIMIT   1
   )
, y AS (
   UPDATE global.prospect psp
   SET    status = status || '*'
   FROM   x
   WHERE  psp.psp_id = x.psp_id
   RETURNING psp.*
   )
INSERT INTO z
SELECT *
FROM   y;

Datamodificerende forespørgsler ved hjælp af CTE'er blev tilføjet med PostgreSQL 9.1.
The manual om WITH forespørgsler (CTE'er).



  1. En simpel introduktion til brug af MySQL på Linux-terminalen

  2. SQLite-hukommelsesproblem med singleton-tilgang

  3. Forespørgselsomkostninger:Globale midlertidige tabeller vs. samlinger (virtuelle arrays)

  4. Postgres GIST vs Btree indeks