MERGE#
Синтаксис#
MERGE INTO target_table [ [ AS ] target_alias ]
USING { source_table | query } [ [ AS ] source_alias ]
ON search_condition
when_clause [...]
где when_clause
является одним из
WHEN MATCHED [ AND condition ]
THEN DELETE
WHEN MATCHED [ AND condition ]
THEN UPDATE SET ( column = expression [, ...] )
WHEN NOT MATCHED [ AND condition ]
THEN INSERT [ column_list ] VALUES (expression, ...)
Описание#
Обновляет, удаляет, а также вставляет новые строки в таблицу согласно условию.
Приемником записей является таблица. Источником записей может быть
таблица или запрос. Использование таблицы в качестве источника
эквивалентно использованию запроса SELECT * FROM source_table
. Каждая
строка источника будет обработана в соответствии с порядком строк,
возвращаемых запросом. Условие ON
определяет логику сопоставления
строк приемника и источника. Если одной строке приемника соответствует
несколько строк источника, будет возвращена ошибка
MERGE_TARGET_ROW_MULTIPLE_MATCHES: One MERGE target table row matched more than one source row
.
MERGE
поддерживает произвольное количество выражений WHEN
. Для
каждой строки может быть вызвано не более одного выражения WHEN
:
Для каждой строки источника сначала будут проанализированы выражения
WHEN MATCHED
в порядке, указанном в запросе. Если найдено подходящее выражениеWHEN MATCHED
, будет выполнена соответствующая командаUPDATE
илиDELETE
. Все остальные выраженияWHEN MATCHED
иWHEN NOT MATCHED
будут проигнорированы.Если подходящих выражений
WHEN MATCHED
не найдено, будут проанализированы выраженияWHEN NOT MATCHED
в порядке, указанном в запросе. Если найдено подходящее выражениеWHEN NOT MATCHED
, будет выполнена соответствующая командаINSERT
. Все остальные выраженияWHEN NOT MATCHED
будут проигнорированы.Если не найдено ни одного подходящего выражения
WHEN MATCHED
илиWHEN NOT MATCHED
, строка источника будет проигнорирована.
Выражения INSERT
и UPDATE
могут ссылаться на колонки источника.
Примеры#
Удаляет всех клиентов, указанных в исходной таблице:
MERGE INTO accounts t USING monthly_accounts_update s
ON t.customer = s.customer
WHEN MATCHED
THEN DELETE
Для совпадающих строк клиентов увеличивает количество покупок. Если совпадений нет, вставляет строку из исходной таблицы:
MERGE INTO accounts t USING monthly_accounts_update s
ON (t.customer = s.customer)
WHEN MATCHED
THEN UPDATE SET purchases = s.purchases + t.purchases
WHEN NOT MATCHED
THEN INSERT (customer, purchases, address)
VALUES(s.customer, s.purchases, s.address)
Удаляет любую совпадающую строку, для которой исходным адресом является Centreville. Для всех других совпадающих строк добавляет покупки и устанавливает адрес, равный адресу источника. Если совпадение отсутствуют, вставляет строку исходной таблицы:
MERGE INTO accounts t USING monthly_accounts_update s
ON (t.customer = s.customer)
WHEN MATCHED AND s.address = 'Centreville'
THEN DELETE
WHEN MATCHED
THEN UPDATE
SET purchases = s.purchases + t.purchases, address = s.address
WHEN NOT MATCHED
THEN INSERT (customer, purchases, address)
VALUES(s.customer, s.purchases, s.address)
Ограничения#
Некоторые коннекторы имеют ограниченную поддержку или не поддерживают
MERGE
. Дополнительные сведения см. в документации по коннекторам.