Инструкция MERGE
Инструкция MERGE напоминает инструкцию CASE в DML. Она объединяет инструкции UPDATE и INSERTS одну, сохраняющую функциональность обеих.
По существу, инструкция MERGE проверяет записи в таблице-источнике и целевой таблице. Если записи существуют в обеих таблицах, то эта инструкция на основе заранее заданных условий обновляет записи в целевой таблице записями, взятыми из таблицы-источника. Если в целевой таблице не оказывается записей, которые есть в таблице-источнике, то они вставляются в целевую таблицу. Инструкция MERGE появилась в версии SQL 2003 стандарта ANSI.
Помните, что при выполнении операций сравнения строк с использованием предложения LIKE значимыми являются все символы строки, включая начальные и конечные пробелы.
MERGE INTO {имя_объекта | подзапрос} [[AS] alias] USING ссылка_на_таблицу [[AS]
псевдоним] ON условия_поиска WHEN MATCHED
THEN UPDATE SET столбец={выражение | DEFAULT} [, …] WHEN NOT MATCHED
THEN INSERT [(столбец [, …])] VALUES (выражение [, …])
MERGE INTO {имя_объекта | подзапрос}
Объявляется целевой объект для операции слияния. Целевой объект может представлять собой таблицу или представление с возможностью обновления (с именем имяобъекта) или может быть подзапросом, создающим вложенную таблицу.
[AS] alias
Указывается необязательный псевдоним для целевой таблицы.
USING ссылка_на_таблицу
Указывается источник для операции слияния: таблица, представление или подзапрос.
ON условия_поиска
Указывается условие или условия, по которым оценивается совпадение таблицы источника и целевой таблицы. Синтаксис по существу тот же, что и для предложения ON инструкции JOIN. Например, при слиянии записей, взятых из таблицы newhireemp, с таблицей emp может выглядеть следующим образом: ON emp.emp_id=new_hire_emp.emp_id.
WHEN MATCHED THEN UPDATE SET столбец={выражение DEFAULT} [, …]
Объявляется, что если запись из таблицы-источника совпадает с записью из целевой таблицы (по условию условие_поиска), то происходит обновление одного или нескольких указанных столбцов значениями, определяемыми выражением.
WHEN NOT MATCHED THEN UPDATE SET столбец={выражение | DEFAULT}}, …]
Объявляется, что если запись из таблицы-источника не совпадает с записью из целевой таблицы (по условию условие_поиска), то происходит обновление одного или нескольких указанных столбцов значениями, определяемыми выражением.
Правила использования инструкции MERGE достаточно просты.
- Предложения WHEN MATCHED и WHEN NOT MATCHED являются обязательными, но их нельзя указывать несколько раз.
- Целевая таблица может представлять собой стандартную обновляемую таблицу, обновляемое представление или обновляемый подзапрос.
- Если ссылка_на_таблицу представляет собой подзапрос, заключайте его в скобки.
- Предложение условие_поиска не должно содержать ссылок на пользовательские функции и хранимые процедуры.
- Предложение условие_поиска может содержать несколько элементов, которые разделяются операторами AND или OR.
- Если в предложении WHEN NOT MATCHED опущен список столбцов, то будет подразумеваться полный список всех столбцов целевой таблицы с их обычным порядковым расположением.
- Другие правила использования инструкции MERGE самоочевидны. Например, столбцы, упоминаемые в предложении WHEN MATCHED, должны быть обновляемыми.