MERGE#
Синтаксис#
MERGE INTO target_table [ @ branch_name ] [ [ 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, ...)
Описание#
Условно обновляет и/или удаляет строки таблицы и/или вставляет в таблицу новые строки.
MERGE изменяет данные в target_table на основе содержимого
source_table. search_condition задает условие, например связь по
одинаковым столбцам, чтобы сопоставить исходные и целевые данные.
MERGE поддерживает произвольное число предложений WHEN. Условия MATCHED
могут выполнять операции DELETE или UPDATE над целевыми данными, а
условия NOT MATCHED могут добавлять данные из источника в целевую таблицу с
помощью INSERT. Дополнительные условия могут сужать набор затрагиваемых
строк.
Для каждой исходной строки предложения WHEN обрабатываются по порядку.
Выполняется только первое подходящее предложение WHEN, а последующие
игнорируются. Запрос завершается ошибкой, если одна строка целевой таблицы
соответствует более чем одной исходной строке.
В предложениях WHEN с операциями UPDATE выражения значений столбцов могут
зависеть от любого поля целевой таблицы или источника. В случае NOT MATCHED
выражения INSERT могут зависеть от любого поля источника.
Типичное использование MERGE включает две таблицы со схожей структурой, но
разными данными. Например, исходная таблица является частью транзакционного
использования в production-системе, а целевая таблица находится в data
warehouse, используемом для аналитики. Периодически операции MERGE
запускаются, чтобы объединить свежие production-данные с долгосрочными
данными в аналитическом warehouse. Если можно определить search condition
между двумя таблицами, можно использовать и сильно отличающиеся таблицы.
Примеры#
Удаление всех customers, упомянутых в исходной таблице:
MERGE INTO accounts t USING monthly_accounts_update s
ON t.customer = s.customer
WHEN MATCHED
THEN DELETE
Для совпадающих строк customers увеличить количество purchases, а при отсутствии совпадения вставить строку из исходной таблицы:
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)
Выполнение MERGE в целевую таблицу из исходной таблицы с удалением любой
совпадающей целевой строки, для которой исходный адрес равен Centreville.
Для всех остальных совпадающих строк добавить исходные purchases и установить
адрес равным исходному адресу. Если совпадения в целевой таблице нет,
вставить строку исходной таблицы:
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)
Удаление всех customers, упомянутых в branch audit исходной таблицы:
MERGE INTO accounts @ audit t USING monthly_accounts_update s
ON t.customer = s.customer
WHEN MATCHED
THEN DELETE
Ограничения#
Любой connector может использоваться как исходная таблица для statement
MERGE. Целью операции merge могут быть только connectors, поддерживающие
statement MERGE. Дополнительные сведения см. в документации по connectors.