Я пытаюсь сделать запрос идемпотентным, помечая строки как обновленные. Однако часть спецификации запроса заключается в том, чтобы возвращать идентификаторы строк, соответствующих фильтру. Я думал сделать что-то вроде следующего:
WITH
prev as (
SELECT id
FROM books
WHERE id = any($1::uuid[])
AND updated
),
updated as (
UPDATE books
SET author = $2 || author, updated = true
WHERE id = any($1::uuid[])
AND not updated
RETURNING id
)
SELECT id FROM prev
UNION ALL
SELECT id FROM updated
Я надеюсь избежать шага дедупликации при использовании UNION
вместо UNION ALL
, поэтому мне было интересно, гарантирует ли семантика оператора, что 1-й запрос не видит результаты 2-го.
Похожие вопросы:
Использование CTE для обновления + выберите:
Порядок выполнения функций с побочными эффектами: Гарантирует ли postgres union порядок выполнения при вызове функций с побочными эффектами?
Ручная дедупликация: обновить таблицу из оператора выбора объединения