Nếu có thể có quyền truy cập ghi đồng thời đến các bảng liên quan, có các điều kiện cuộc đua trong các truy vấn sau đây. Cân nhắc:
Ví dụ của bạn can sử dụng CTE (biểu thức bảng chung), nhưng nó sẽ không cung cấp cho bạn điều gì mà một truy vấn con không thể làm được:
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.*;
Hàng trả về sẽ là hàng đã cập nhật phiên bản.
Nếu bạn muốn chèn hàng đã trả về vào một bảng khác, đó là nơi có WITH
mệnh đề trở nên thiết yếu:
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;
Các truy vấn sửa đổi dữ liệu bằng CTE đã được thêm vào với PostgreSQL 9.1.
The hướng dẫn về WITH
truy vấn (CTE).