Ако може да има едновременен достъп за запис към включените таблици, има условия за състезание в следните заявки. Помислете за следното:
Вашият пример може използвайте CTE (израз на обща таблица), но няма да ви даде нищо, което подзаявка не може да направи:
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.*;
Върнатият ред ще бъде актуализиран версия.
Ако искате да вмъкнете върнатия ред в друга таблица, там е WITH
клаузата става съществена:
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;
Заявките за модифициране на данни, използващи CTE, бяха добавени с PostgreSQL 9.1.
The ръководство за WITH
заявки (CTE).