PostgreSQL: не правильно обновляет данные в таблице

Всем привет. У меня есть такой запрос:

WITH all_values AS (
    SELECT s.projectid AS projectid,
           max(s.prompttype) AS prompttype,
           max(el.inputs->>'name') AS name,
           max(el.inputs->>'desc') AS description,
           v.value AS value,
           max(s.scriptid) AS scriptid,
           max(s.corpuscode) AS corpuscode
    FROM source.table AS s
       CROSS JOIN LATERAL jsonb_array_elements(s.inputs::jsonb) AS el(inputs)
       CROSS JOIN LATERAL jsonb_array_elements(el.inputs->'values') AS v(value)
    WHERE
        s.prompttype = 'input' AND (s.created > now() - interval '30 minutes' OR s.modified > now() - interval '30 minutes')
    GROUP BY s.projectid, v.value
   ), not_unique_items AS (
    SELECT all_values.projectid, all_values.prompttype, all_values.name, all_values.description, all_values.value, all_values.scriptid, all_values.corpuscode
    FROM all_values
    WHERE all_values.projectid :: BIGINT IN (SELECT collect_project_id FROM collect.dim_collect_user_inp_configs WHERE collect_project_id IS NOT NULL)
      AND all_values.value :: VARCHAR IN (SELECT prompt_input_value FROM target.table WHERE prompt_input_value IS NOT NULL)
   )
UPDATE target.table
SET prompt_input_desc = s.description, prompt_input_name = s.name, date_updated = NOW()
FROM not_unique_items AS s
WHERE prompt_input_desc != s.description OR prompt_input_name != s.name;

Суть этого запроса такова:

  1. Сходить в исходную таблицу и взять оттуда данные и разложить JSON на компоненты таким образом, чтобы в одну строку попали уникальные values.
  2. Дальше проверить, есть ли такие values в таблице, куда перекладываем данные (то есть выбираем только не уникальные)
  3. Если нашли не уникальные, то обновляем некоторые колонки для них и вместе с тем изменяем дату обновления строки. При этом нужно обновить данные только для тех, у которых поменялись указанные колонки. И, следовательно, только для этих строк изменится время обновления данных.

Но что-то у меня не срабатывает условие проверки обновления только измененных данных и оно обновляет дату обновления для всех найденных строк.

Подскажите, что я сделал не так?


Ответы (0 шт):