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:

  1. Для каждой строки источника сначала будут проанализированы выражения WHEN MATCHED в порядке, указанном в запросе. Если найдено подходящее выражение WHEN MATCHED, будет выполнена соответствующая команда UPDATE или DELETE. Все остальные выражения WHEN MATCHED и WHEN NOT MATCHED будут проигнорированы.

  2. Если подходящих выражений WHEN MATCHED не найдено, будут проанализированы выражения WHEN NOT MATCHED в порядке, указанном в запросе. Если найдено подходящее выражение WHEN NOT MATCHED, будет выполнена соответствующая команда INSERT. Все остальные выражения WHEN NOT MATCHED будут проигнорированы.

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

См. также#

INSERT, UPDATE, DELETE