@aarifkhamdi

Как правильно написать двойное обновление?

WITH hide AS
(
  UPDATE "TABLE1"
  SET
    "Value1" = FALSE
  WHERE "кое-что" = ANY ($1 :: INT [])
)
UPDATE "TABLE1"
SET
  "Value2" = TRUE
WHERE "кое-что" = ANY ($1 :: INT [])
      AND NOT EXISTS(
    SELECT NULL
    FROM "TABLE2"
    WHERE "что-то" = "кое-что"
)
      AND NOT EXISTS(
    SELECT NULL
    FROM "TABLE3"
    WHERE "что-то" = "кое-что"
)


в результате работает только вторая часть. как правильно сделать?
  • Вопрос задан
  • 286 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Вы сильно заблуждаетесь, если думаете, что ваш cte выполняется последовательно.
The sub-statements in WITH are executed concurrently with each other and with the main query. Therefore, when using data-modifying statements in WITH, the order in which the specified updates actually happen is unpredictable. All the statements are executed with the same snapshot (see Chapter 13), so they cannot "see" one another's effects on the target tables.

https://www.postgresql.org/docs/9.6/static/queries...

Вы выполняете на одном слепке данных одних и тех строк различающиеся действия. Не надо так. Я понятий не имею, какой эффект от этого будет.
К тому же вы элементарно переписываетесь в один просто запрос
UPDATE "TABLE1"
SET
  "Value2" = (NOT EXISTS(
    SELECT NULL
    FROM "TABLE2"
    WHERE "что-то" = "кое-что"
)
      AND NOT EXISTS(
    SELECT NULL
    FROM "TABLE3"
    WHERE "что-то" = "кое-что"
))
WHERE "кое-что" = ANY ($1 :: INT [])
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Убрать оператор with, оставьте от него только внутренний update.
Если вы объявляете with, то его нужно использовать, а он у вас не используется, поэтому и первый update не срабатывает.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы