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).