Om det kan finnas samtidig skrivåtkomst för inblandade tabeller finns det tävlingsförhållanden i följande frågor. Tänk på:
Ditt exempel kan använd ett CTE (vanligt tabelluttryck), men det ger dig inget som en underfråga inte kunde göra:
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 returnerade raden kommer att vara den uppdaterade version.
Om du vill infoga den returnerade raden i en annan tabell, det är där en WITH
klausul blir 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;
Datamodifierande frågor med CTE lades till med PostgreSQL 9.1.
The manual om WITH
frågor (CTE).