Jika ada akses tulis bersamaan untuk tabel yang terlibat, ada kondisi balapan dalam kueri berikut. Pertimbangkan:
Contoh Anda bisa gunakan CTE (ekspresi tabel umum), tetapi itu tidak akan memberi Anda apa pun yang tidak dapat dilakukan oleh subquery:
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.*;
Baris yang dikembalikan akan menjadi diperbarui versi.
Jika Anda ingin menyisipkan baris yang dikembalikan ke tabel lain, di situlah WITH
klausa menjadi penting:
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;
Kueri modifikasi data menggunakan CTE ditambahkan dengan PostgreSQL 9.1.
The manual tentang WITH
kueri (CTE).