Примеры использования команды MERGE

Команда MERGE в SQL Server (и других СУБД, поддерживающих MERGE, например, Oracle) позволяет выполнять операции вставки, обновления и удаления в одной команде. Это полезно для синхронизации данных между двумя таблицами.

Синтаксис

MERGE INTO target_table AS target
USING source_table AS source
ON target.key_column = source.key_column
WHEN MATCHED THEN
    -- Операция при совпадении
    UPDATE SET target.column1 = source.column1, target.column2 = source.column2
WHEN NOT MATCHED THEN
    -- Операция при отсутствии совпадения
    INSERT (column1, column2) VALUES (source.column1, source.column2)
WHEN NOT MATCHED BY SOURCE THEN
    -- Операция при отсутствии совпадения в источнике (опционально)
    DELETE;

Примеры использования

Обновление и вставка данных

В этом примере обновляются существующие записи и вставляются новые, если они отсутствуют в целевой таблице.

MERGE INTO employees AS e
USING new_employees AS n
ON e.employee_id = n.employee_id
WHEN MATCHED THEN
    UPDATE SET e.name = n.name, e.salary = n.salary
WHEN NOT MATCHED THEN
    INSERT (employee_id, name, salary)
    VALUES (n.employee_id, n.name, n.salary);
  • Если запись с employee_id уже существует в таблице employees, то ее name и salary обновятся.

  • Если запись с employee_id отсутствует, она будет вставлена.

Обновление, вставка и удаление данных

В этом примере осуществляется обновление существующих записей, вставка новых и удаление записей, которые больше не присутствуют в источнике.

MERGE INTO inventory AS i
USING new_stock AS n
ON i.item_id = n.item_id
WHEN MATCHED AND n.quantity = 0 THEN
    DELETE
WHEN MATCHED THEN
    UPDATE SET i.quantity = n.quantity
WHEN NOT MATCHED THEN
    INSERT (item_id, quantity)
    VALUES (n.item_id, n.quantity);
  • Если запись с item_id существует и quantity равен 0, запись удаляется.

  • Если запись с item_id существует и quantity больше 0, quantity обновляется.

  • Если запись с item_id отсутствует, новая запись вставляется.

Обновление и вставка с дополнительными условиями

В этом примере используются условия для выполнения дополнительных проверок при обновлении или вставке данных.

MERGE INTO sales AS s
USING updated_sales AS u
ON s.sale_id = u.sale_id
WHEN MATCHED AND u.amount > s.amount THEN
    UPDATE SET s.amount = u.amount, s.sale_date = u.sale_date
WHEN NOT MATCHED THEN
    INSERT (sale_id, amount, sale_date)
    VALUES (u.sale_id, u.amount, u.sale_date);
  • Если запись с sale_id существует и новый amount больше старого, amount и sale_date обновляются.

  • Если запись с sale_id отсутствует, вставляется новая запись.

Усложненные сценарии

В некоторых случаях можно использовать дополнительные условия и логические операторы.

MERGE INTO employees AS e
USING updated_employees AS u
ON e.employee_id = u.employee_id
WHEN MATCHED THEN
    UPDATE SET e.name = u.name,
               e.salary = CASE 
                           WHEN u.salary > e.salary THEN u.salary
                           ELSE e.salary
                           END
WHEN NOT MATCHED THEN
    INSERT (employee_id, name, salary)
    VALUES (u.employee_id, u.name, u.salary);
  • В этом примере зарплата обновляется только если новая зарплата больше текущей.

  • Если запись с employee_id отсутствует, вставляется новая запись.

Особенности

  • Поддержка: Команда MERGE поддерживается в SQL Server, Oracle, и некоторых других системах баз данных. Она не является частью стандартного SQL и может отсутствовать в других СУБД.

  • Производительность: Использование MERGE может быть более эффективным для синхронизации данных, так как позволяет выполнять несколько операций в одном запросе.

  • Триггеры и блокировки: При использовании MERGE следует учитывать возможные блокировки и влияние на триггеры, так как операция может затрагивать множество строк.

Команда MERGE предоставляет мощный и гибкий способ синхронизации данных, упрощая обработку операций вставки, обновления и удаления в одном запросе.

Last updated