Возможно, конечно. Вопрос в том, сколько и чего для этого надо делать.
upsert/merge/ON CONFLICT/on duplicate key/replace как простой случай и со своими тараканами. И не предполагают что-то делать с записями, которых больше нет в новом наборе данных.
Более многословный способ, но более гибкий:
begin
create temporary table temptable ON COMMIT DROP
insert в эту временную таблицу всех новых значений
create index on tempname по полям, по которым будем сравнивать
delete from tablename записей, которых нет в новой таблице (ну или апдейт)
insert into tablename .. select from temptable для записей, к которым не нашлось пар в старой таблице
update с inner join'ом для записей. которые есть и там и там
Можно делать в одном cte. Эффективнее ли not exists, left join или один общий full outer join - это надо смотреть на конкретном примере с конкретной базой.
drop temporary table, если ваша субд не умеет on commit drop или его аналог.
commit;
|