sql >> Base de Datos >  >> RDS >> PostgreSQL

Orientación sobre el uso de la cláusula WITH en SQL

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).