В Oracle я использую оператор MERGE, например:
merge into live_table l
using (
select *
from staging_table
where merged = 'N'
) s
on (i.id = s.id)
when matched then
update l.description = s.description
when not matched then
insert (l.id, l.description)
values (s.id, s.description)
;
Промежуточная таблица также содержит флаг «слияния», который я хочу обновить до «Y» после слияния.
Я думал, что смогу совместить это с дополнительным обновлением (после слияния), например:
update staging_table
set merged = 'Y'
where id in (select id
from live_table)
;
но при этом также обновляется флаг для записей, которые уже были объединены в предыдущих транзакциях. Обходной путь должен написать это как цикл, который обрабатывает вставку / обновление один за другим, но это нарушило бы простоту оператора MERGE.
Как я могу обновить флаг слияния таким образом, чтобы я был уверен, что обновляются только те строки, на которые влияет оператор слияния?