PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Anleitung zur Verwendung der WITH-Klausel in SQL

Wenn gleichzeitiger Schreibzugriff möglich ist In den beteiligten Tabellen gibt es Race Conditions in den folgenden Abfragen. Bedenken Sie:

Ihr Beispiel kann Verwenden Sie einen CTE (allgemeiner Tabellenausdruck), aber er gibt Ihnen nichts, was eine Unterabfrage nicht tun könnte:

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.*;

Die zurückgegebene Zeile ist die aktualisierte Version.

Wenn Sie möchten die zurückgegebene Zeile in eine andere Tabelle einfügen, dort ist ein WITH Klausel wird wesentlich:

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;

Datenmodifizierende Abfragen mit CTEs wurden mit PostgreSQL 9.1 hinzugefügt.
The Handbuch zu WITH Abfragen (CTEs).