Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Oracle Tutorial.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
401.64 Кб
Скачать

Оператор merge.

Оператор MERGE работает так: есть порция вливаемых данных (SRC) и таблица-приемник, в которую мы их вливаем (DEST).

Если ключ в таблице-приемнике найден, то update-им другие поля в таблице-приемнике указанным образом.

Если же ключ в таблице-приемнике не найден, то insert-им в таблицу-приемник указанным образом.

MERGE еще иногда называют “update else insert” или “upsert”.

Подробнее мы разберем его в задаче ниже.

Задача. Merge данных о студентах.

Создать пустую таблицу KK_STUDENTS_ALL_YEARS. С помощью оператора MERGE внести в нее сначала данные из таблицы KK_STUDENTS_2010, а потом из таблицы KK_STUDENTS_2012 (см. задачу “Сравнение множеств”).

Создадим пустую таблицу KK_STUDENTS_ALL_YEARS:

CREATE TABLE KK_STUDENTS_ALL_YEARS AS SELECT * FROM KK_STUD_2010 WHERE 0=1;

"Вмёржим" в KK_STUDENTS_ALL_YEARS данные за 2010 год. Будут только insert-ы:

MERGE INTO KK_STUDENTS_ALL_YEARS DEST

USING (SELECT ID, NAME FROM KK_STUD_2010) SRC

ON (DEST.ID = SRC.ID)

WHEN MATCHED THEN

UPDATE SET DEST.NAME = SRC.NAME

WHEN NOT MATCHED THEN

INSERT (DEST.ID, DEST.NAME) VALUES (SRC.ID, SRC.NAME);

Проверим результат:

SELECT * FROM KK_STUDENTS_ALL_YEARS;

Сменим фамилию одному из студентов (в 2012 году сменил фамилию), сохранив первичный ключ ID:

UPDATE KK_STUD_2012 SET NAME = 'ТРУНОВА' WHERE ID = 2;

"Вмёржим" в KK_STUDENTS_ALL_YEARS данные за 2012 год. Будут insert-ы и update-ы:

MERGE INTO KK_STUDENTS_ALL_YEARS DEST

USING (SELECT ID, NAME FROM KK_STUD_2012) SRC

ON (DEST.ID = SRC.ID)

WHEN MATCHED THEN

UPDATE SET DEST.NAME = SRC.NAME

WHEN NOT MATCHED THEN

INSERT (DEST.ID, DEST.NAME) VALUES (SRC.ID, SRC.NAME);

Проверим результат:

SELECT * FROM KK_STUDENTS_ALL_YEARS;

MERGE является одним из эффективных способов вливания дельты (порции изменившихся данных) в таблицу-приемник.

Задача. Merge данных о клиентах.

Дана таблица kk_clients со списком клиентов:

create table kk_clients (id integer, name varchar2(60), passport char(11));

Дана таблица kk_clients_delta, в которой собрана порция изменившихся за сутки данных о клиентах - новых и старых, причем имя и фамилия поступают в отдельных полях.

create table kk_clients_delta (id integer, firstname varchar2(30), lastname varchar2(30), passport char(11));

Поле id – первичный ключ в обеих таблицах.

Написать оператор merge, который вливает данные из kk_clients_delta в kk_clients.

Заполним таблицы данными:

insert into kk_clients values (1,'Козлов Сергей','6605 700822');

insert into kk_clients values (2,'Стервятников Евгений','1390 193734');

insert into kk_clients values (3,'Баранов Илья','8808 848908');

insert into kk_clients values (4,'Шакалов Григорий','7209 888614');

insert into kk_clients values (5,'Крысин Роман','8976 616964');

insert into kk_clients values (6,'Змеев Игорь','5332 659236');

insert into kk_clients values (7,'Свиньин Абрам','1015 305818');

insert into kk_clients values (8,'Пиявкин Ираклий','7015 389388');

insert into kk_clients values (9,'Червяков Иосиф','3249 300256');

insert into kk_clients values (10,'Трутнев Абдулла','6950 327070');

insert into kk_clients_delta values (7,'Свиньин','Абрам','5587 324786');

insert into kk_clients_delta values (10,'Трутнев','Владимир','6950 327070');

insert into kk_clients_delta values (11,'Рыропротьев','Станислав','2901 849017');

merge into kk_clients dest

using (select * from kk_clients_delta) src

on (dest.id = src.id)

when matched then

update

set dest.name = src.firstname || ' ' || src.lastname,

dest.passport = src.passport

when not matched then

insert

values

(src.id, src.firstname || ' ' || src.lastname, src.passport);

Посмотрим результат:

select * from kk_clients;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]