Освоение T-SQL MERGE: простая обработка непревзойденных условий

В мире SQL Server оператор MERGE — это мощный инструмент для объединения данных из разных источников. Он позволяет выполнять операции вставки, обновления и удаления в одном операторе. Однако одной из распространенных проблем является обработка несовпадающих условий во время операции MERGE. В этой статье блога мы рассмотрим различные методы эффективного решения этой проблемы с помощью T-SQL.

Метод 1: использование предложения OUTPUT
Предложение OUTPUT в T-SQL позволяет захватывать затронутые строки из оператора MERGE. Используя это предложение, вы можете идентифицировать несовпадающие строки и предпринять необходимые действия. Вот пример:

MERGE TargetTable AS T
USING SourceTable AS S
ON T.Id = S.Id
WHEN MATCHED THEN
    UPDATE SET T.Name = S.Name
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Id, Name) VALUES (S.Id, S.Name)
OUTPUT $action, inserted.Id AS InsertedId, deleted.Id AS DeletedId;

Метод 2: использование временной таблицы.
Другой подход — использовать временную таблицу для хранения несовпадающих строк и обработки их отдельно. Вот как это можно сделать:

CREATE TABLE #UnmatchedRows (Id INT, Name VARCHAR(50));
MERGE TargetTable AS T
USING SourceTable AS S
ON T.Id = S.Id
WHEN MATCHED THEN
    UPDATE SET T.Name = S.Name
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Id, Name) VALUES (S.Id, S.Name)
OUTPUT $action, inserted.Id INTO #UnmatchedRows;
-- Perform desired actions on #UnmatchedRows
DROP TABLE #UnmatchedRows;

Метод 3: использование CTE (общее табличное выражение)
CTE также может пригодиться при работе с несовпадающими условиями. Это позволяет вам отделить несовпадающие строки и обработать их соответствующим образом. Вот пример:

WITH UnmatchedRows AS (
    SELECT S.Id, S.Name
    FROM SourceTable AS S
    LEFT JOIN TargetTable AS T ON T.Id = S.Id
    WHERE T.Id IS NULL
)
MERGE TargetTable AS T
USING SourceTable AS S
ON T.Id = S.Id
WHEN MATCHED THEN
    UPDATE SET T.Name = S.Name
WHEN NOT MATCHED BY TARGET THEN
    INSERT (Id, Name) VALUES (S.Id, S.Name)
OUTPUT $action, inserted.Id AS InsertedId
WHERE EXISTS (SELECT 1 FROM UnmatchedRows WHERE Id = inserted.Id);

Обработка несовпадающих условий в операторах T-SQL MERGE может выполняться различными методами. Используя такие методы, как предложение OUTPUT, временные таблицы или CTE, вы можете эффективно идентифицировать и обрабатывать несовпадающие строки в соответствии с вашими конкретными требованиями. Эти подходы обеспечивают гибкость и контроль при интеграции данных из разных источников с помощью операции MERGE в SQL Server.

Не забудьте выбрать метод, который лучше всего соответствует вашим потребностям и оптимизирует производительность. Приятного кодирования!