Напишем блок кода, решающий задачу. Для реализации left join в oracle существует возможность упрощенной записи с помощью знака '(+)', которую мы продемонстрируем. Update будем делать по rowid ради повышения скорости работы:
begin
for z in (select a.animal_name, a.height, m.rowid m_rowid, b.rowid b_rowid
from animal_heights a, mammals m, birds b
where a.animal_name = m.mammal_name(+)
and a.animal_name = b.bird_name(+)) loop
if z.m_rowid is not null then
update mammals set height = z.height where rowid = z.m_rowid;
end if;
if z.b_rowid is not null then
update birds set height = z.height where rowid = z.b_rowid;
end if;
end loop;
end;
Посмотрим результаты update-ов:
select * from mammals;
select * from birds;
Оператор 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-ы: