Als er gelijktijdige schrijftoegang . kan zijn voor de betrokken tabellen zijn er racevoorwaarden in de volgende vragen. Overweeg:
Uw voorbeeld kan gebruik een CTE (common table expression), maar het geeft je niets dat een subquery niet zou kunnen doen:
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.*;
De geretourneerde rij is de bijgewerkte versie.
Als je de geretourneerde rij in een andere tabel wilt invoegen, daar staat een WITH
clausule wordt essentieel:
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;
Query's voor het wijzigen van gegevens met behulp van CTE's zijn toegevoegd met PostgreSQL 9.1.
De handleiding over WITH
zoekopdrachten (CTE's).