Оператор MERGE в SQL Server – это мощный инструмент, который позволяет синхронизировать две таблицы путем вставки, удаления и обновления строк на основе условия соединения. В этой статье мы рассмотрим синтаксис и различные условия оператора MERGE, а также предоставим примеры для иллюстрации его использования.
Синтаксис оператора MERGE
Синтаксис оператора MERGE в SQL Server выглядит следующим образом:
MERGE TOP (значение) <целевая_таблица> USING <источник_таблицы> ON <условие_соединения> [WHEN MATCHED [AND <условие_клаузы>] THEN <действие_при_совпадении>] [WHEN NOT MATCHED [BY TARGET] [AND <условие_клаузы>] THEN <действие_при_отсутствии_совпадения_в_целевой>] [WHEN NOT MATCHED BY SOURCE [AND <условие_клаузы>] THEN <действие_при_отсутствии_совпадения_в_источнике>] [<выходная_клауза>] [OPTION (<подсказка_запроса>)];
Использование MERGE для обновления совпадающих строк
Клауза WHEN MATCHED в операторе MERGE используется для обновления или удаления строк в целевой таблице, когда они совпадают с исходной таблицей на основе условия соединения. Вот пример:
MERGE Locations T
USING Locations_stage S
ON T.LocationID = S.LocationID
WHEN MATCHED THEN
UPDATE SET T.LocationName = S.LocationName;
В этом примере строки с LocationID 1 и 3 в целевой таблице совпадают с строками в исходной таблице, и их значения LocationName обновляются соответственно.
Использование дополнительных условий поиска
Вы также можете использовать дополнительные условия поиска вместе с клаузой WHEN MATCHED, чтобы обновлять только определенные строки, соответствующие дополнительному условию. Вот пример:
MERGE Locations T
USING Locations_stage S
ON T.LocationID = S.LocationID
WHEN MATCHED AND T.LocationID = 3 THEN
UPDATE SET T.LocationName = S.LocationName;
В этом примере обновляется только строка с LocationID 3 в целевой таблице, потому что она удовлетворяет дополнительному условию поиска.
Использование MERGE для вставки строк
Клауза WHEN NOT MATCHED BY TARGET в операторе MERGE используется для вставки строк в целевую таблицу, которые не соответствуют условию соединения с исходной таблицей. Вот пример:
MERGE Locations T
USING Locations_stage S
ON T.LocationID = S.LocationID
WHEN NOT MATCHED BY TARGET THEN
INSERT (LocationID, LocationName)
VALUES (S.LocationID, S.LocationName);
В этом примере строка с LocationID 4 в исходной таблице вставляется в целевую таблицу, потому что она не соответствует условию соединения.
Использование MERGE для удаления строк
Клауза WHEN NOT MATCHED BY SOURCE в операторе MERGE используется для удаления строк в целевой таблице, которые не соответствуют условию соединения с исходной таблицей. Вот пример:
MERGE Locations T
USING Locations_stage S
ON T.LocationID = S.LocationID
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
В этом примере строка с LocationID 2 в целевой таблице удаляется, потому что она не соответствует условию соединения.
Использование клаузы TOP в операторе MERGE
Клауза TOP в операторе MERGE используется для ограничения количества строк, затронутых операцией слияния. Вот пример:
MERGE TOP (1) Locations T
USING Locations_stage S
ON T.LocationID = S.LocationID
WHEN MATCHED THEN
UPDATE SET T.LocationName = S.LocationName;
В этом примере только первая совпавшая строка обновляется в целевой таблице.
Использование клаузы OUTPUT в операторе MERGE
Клауза OUTPUT в операторе MERGE позволяет получить измененные строки из целевой таблицы. Вот пример:
MERGE Locations T
USING Locations_stage S
ON T.LocationID = S.LocationID
WHEN MATCHED THEN
UPDATE SET T.LocationName = S.LocationName
OUTPUT DELETED.*, $action AS Action, INSERTED.*;
В этом примере клауза OUTPUT возвращает удаленные и вставленные строки, а также выполненное действие (обновление или вставка).
Использование MERGE с триггерами
Если у вас есть триггеры на целевой таблице, вы должны создать триггеры для всех операций DML, указанных в операторе MERGE. Вот пример:
CREATE TRIGGER trgLocations ON Locations
INSTEAD OF INSERT, UPDATE, DELETE
AS
BEGIN
-- Логика триггера здесь
END;
MERGE Locations T
USING Locations_stage S
ON T.LocationID = S.LocationID
WHEN MATCHED THEN
UPDATE SET T.LocationName = S.LocationName
WHEN NOT MATCHED BY TARGET THEN
INSERT (LocationID, LocationName)
VALUES (S.LocationID, S.LocationName)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
В этом примере мы создали триггер INSTEAD OF для всех операций DML, указанных в операторе MERGE.
Заключение
Оператор MERGE в SQL Server – это мощный инструмент для синхронизации двух таблиц. Он позволяет вставлять, обновлять и удалять строки на основе условия соединения. Понимая синтаксис и различные условия оператора MERGE, вы можете эффективно управлять данными в вашей базе данных SQL Server.