Использование MERGE для обновления данных

Команда MERGE в SQL Server и некоторых других системах баз данных позволяет эффективно обновлять данные, а также вставлять или удалять строки в зависимости от условий. Вот как можно использовать команду MERGE для обновления данных:

Синтаксис MERGE

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;

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

Обновление существующих записей

В этом примере обновляются данные в таблице employees, используя данные из таблицы new_employees. Если запись с определённым employee_id существует, её данные обновляются.

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;
  • Если запись с employee_id совпадает в обеих таблицах, поля name и salary в таблице employees будут обновлены значениями из new_employees.

Обновление с условиями

В этом примере записи обновляются только если новое значение salary больше текущего значения.

MERGE INTO employees AS e
USING new_employees AS n
ON e.employee_id = n.employee_id
WHEN MATCHED AND n.salary > e.salary THEN
    UPDATE SET e.salary = n.salary, e.name = n.name;
  • Если запись с employee_id совпадает и новое значение salary больше текущего, то поле salary обновляется. Также обновляется поле name.

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

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

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 существует, она обновляется. Если записи с таким employee_id нет, она вставляется.

Обновление с условием и удаление

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

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 BY SOURCE THEN
    DELETE;
  • Если запись с employee_id существует в employees, она обновляется. Если запись отсутствует в new_employees, она удаляется из employees.

Особенности и рекомендации

  • Поддержка: MERGE поддерживается в SQL Server, Oracle и некоторых других СУБД. В PostgreSQL и MySQL для выполнения аналогичных задач могут использоваться другие конструкции, такие как INSERT ... ON CONFLICT и REPLACE.

  • Триггеры: Будьте осторожны с триггерами, так как команда MERGE может вызывать их несколько раз (например, при вставке и обновлении).

  • Производительность: MERGE может быть более эффективен, чем несколько отдельных запросов, так как он объединяет логику вставки, обновления и удаления в одном запросе. Однако следует тщательно проверять план выполнения, чтобы избежать проблем с производительностью.

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

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

Last updated