Pokud může existovat souběžný přístup pro zápis k zapojeným tabulkám, v následujících dotazech jsou podmínky závodu. Zvažte:
Váš příklad může použijte CTE (common table expression), ale nedá vám nic, co by poddotaz nedokázal:
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.*;
Vrácený řádek bude aktualizovaný verze.
Pokud chcete vložit vrácený řádek do jiné tabulky, tam je WITH
klauzule se stává zásadní:
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;
Do PostgreSQL 9.1 byly přidány dotazy upravující data pomocí CTE.
The manuál o WITH
dotazy (CTE).