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.