Усложним задачу. Познакомимся с возможностью делать в рамках оператора merge нe только insert-ы, update-ы, но и delete-ы.
Добавим в таблицу kk_clients_delta поле status, принимающее значения: 'INSERTED' - для insert-ов и update-ов, а 'DELETED' - для delete-ов:
alter table kk_clients_delta add status varchar2(10);
Заполним kk_clients_delta новыми данными:
truncate table kk_clients_delta;
insert into kk_clients_delta values (12,'Андриянов','Андрей','3756 918622','INSERTED');
insert into kk_clients_delta values (3,'Баранов','Илья','3799 616345','INSERTED');
insert into kk_clients_delta values (5,'Крысин','Роман','8976 616964','DELETED');
Напишем оператор merge, который вставит id = 12, изменит паспорт у id = 3 и удалит id = 5:
MERGE INTO kk_clients DEST
USING (SELECT ID, firstname || ' ' || lastname name, passport, status
FROM kk_clients_delta) SRC
ON (DEST.ID = SRC.ID)
WHEN MATCHED THEN
UPDATE
SET DEST.NAME = SRC.NAME,
DEST.PASSPORT = SRC.PASSPORT
/*WHERE SRC.STATUS = 'INSERTED'*/
DELETE
WHERE SRC.STATUS = 'DELETED'
WHEN NOT MATCHED THEN
INSERT
(DEST.ID, DEST.NAME, DEST.PASSPORT)
VALUES
(SRC.ID, SRC.NAME, SRC.PASSPORT) WHERE SRC.STATUS = 'INSERTED';
Посмотрим результат:
select * from kk_clients;
Обратим внимание на закомментированную строку /*WHERE SRC.STATUS = 'INSERTED'*/. Если ее раскомментировать, код не будет выполнять желаемые изменения, что является загадочной особенностью oracle.