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;
Суть этого запроса такова:
- Сходить в исходную таблицу и взять оттуда данные и разложить JSON на компоненты таким образом, чтобы в одну строку попали уникальные values.
- Дальше проверить, есть ли такие values в таблице, куда перекладываем данные (то есть выбираем только не уникальные)
- Если нашли не уникальные, то обновляем некоторые колонки для них и вместе с тем изменяем дату обновления строки. При этом нужно обновить данные только для тех, у которых поменялись указанные колонки. И, следовательно, только для этих строк изменится время обновления данных.
Но что-то у меня не срабатывает условие проверки обновления только измененных данных и оно обновляет дату обновления для всех найденных строк.
Подскажите, что я сделал не так?