Si puede haber acceso de escritura simultáneo a las tablas involucradas, hay condiciones de carrera en las siguientes consultas. Considere:
Tu ejemplo puede use un CTE (expresión de tabla común), pero no le dará nada que una subconsulta no pueda hacer:
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.*;
La fila devuelta será la actualizada versión.
Si desea insertar la fila devuelta en otra tabla, ahí es donde un WITH
cláusula se vuelve esencial:
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;
Las consultas de modificación de datos mediante CTE se agregaron con PostgreSQL 9.1.
La manual sobre WITH
consultas (CTE).