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