Удаление строк с помощью команды 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 AND <condition> THEN
    DELETE;

Примеры удаления строк

Удаление строк, которые не присутствуют в исходной таблице

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

MERGE INTO employees AS e
USING new_employees AS n
ON e.employee_id = n.employee_id
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;

Объяснение:

  • ON e.employee_id = n.employee_id указывает, что строки будут сопоставляться по столбцу employee_id.

  • WHEN NOT MATCHED BY SOURCE означает, что удаление произойдет только для строк, которые существуют в employees, но отсутствуют в new_employees.

Удаление строк при выполнении условий

В этом примере удаляются строки из таблицы employees, если запись с таким же employee_id существует в таблице new_employees и значение salary в new_employees меньше 50000.

MERGE INTO employees AS e
USING new_employees AS n
ON e.employee_id = n.employee_id
WHEN MATCHED AND n.salary < 50000 THEN
    DELETE;

Объяснение:

  • WHEN MATCHED AND n.salary < 50000 означает, что удаление произойдет только если запись с employee_id существует и значение salary в new_employees меньше 50000.

Удаление строк с устаревшими статусами

В этом примере удаляются записи из таблицы employees, если статус в new_employees равен 'inactive'.

MERGE INTO employees AS e
USING new_employees AS n
ON e.employee_id = n.employee_id
WHEN MATCHED AND n.status = 'inactive' THEN
    DELETE;

Объяснение:

  • WHEN MATCHED AND n.status = 'inactive' означает, что запись будет удалена, если статус в new_employees равен 'inactive'.

Удаление строк, которые не обновлены

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

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;

Объяснение:

  • WHEN MATCHED обновляет строки, которые существуют в обеих таблицах.

  • WHEN NOT MATCHED BY SOURCE удаляет строки из employees, которые не присутствуют в new_employees.

Удаление и вставка новых строк

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

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
WHEN NOT MATCHED THEN
    INSERT (employee_id, name, salary)
    VALUES (n.employee_id, n.name, n.salary);

Объяснение:

  • WHEN MATCHED обновляет строки, которые существуют в обеих таблицах.

  • WHEN NOT MATCHED BY SOURCE удаляет строки из employees, которые отсутствуют в new_employees.

  • WHEN NOT MATCHED вставляет новые строки, если они отсутствуют в employees.

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

  • Индексы: Убедитесь, что у вас есть индексы на колонках, используемых в условиях ON, чтобы улучшить производительность выполнения команды MERGE.

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

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

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

Last updated