В приложениях SQL-ориентированных баз данных часто возникает потребность в передаче множества строк из таблицы, обновлявшейся при выполнении транзакции (транзакционной таблицы), в некоторую основную таблицу базы данных. Обычно транзакционная таблица содержит обновленные варианты строк, существующих в основной таблице, а также, возможно, новые строки, которые должны быть занесены в основную таблицу. При наличии традиционных средств обновления базы данных содержимое транзакционной таблицы может быть перенесено в основную таблицу путем выполнения двух отдельных шагов. На первом шаге требуется выполнить оператор UPDATE для всех строк основной таблицы, для которых имеются модифицированные “двойники” в транзакционной таблице. Затем нужно выполнить оператор INSERT для занесения в основную таблицу всех строк транзакционной таблицы, для которых таких двойников нет. Оператор MERGE, введенный в SQL:2003, позволяет выполнить такую операцию за один шаг, более эффективный и проще специфицируемый. Вот общий синтаксис этого нового оператора в немного упрощенной форме:
MERGE INTO table_name [ [ AS ] correlation_name ]
USING table_reference
ON conditional_expression merge_operation_specification
merge_operation_specification ::=
{ merge_when_matched_clause | merge when not matched clause }
| merge_when_matched_clause merge_when_not_matched_clause
| merge_when_not_matched_clause merge_when_matched_clause
merge_when_matched_clause ::=
WHEN MATCHED THEN UPDATE SET update_assignment_commalist
merge_when_not_matched_clause ::=
WHEN NOT MATCHED THEN INSERT [ ( column_commalist ) ]
VALUES ( value_expression_commalist )
Как видно из синтаксиса, в операторе обязательно содержится условное выражение и, по крайней мере, один из разделов “слияния при наличии сопоставления” (merge_when_matched_clause) и “слияния при отсутствии сопоставления” (merge when not matched clause). Пусть T1 обозначает таблицу, указанную в разделе USING, а T2 – имя таблицы, указанной в разделе INTO. Тогда семантика выполнения операции определяется следующим образом: