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. Дополнительные сведения см. в документации по коннекторам.