Объединять данные на основе нескольких таблиц
Выполняя операции с базой данных, иногда требуется выполнить операцию SQL MERGE. Этот параметр DML позволяет синхронизировать две таблицы путем вставки, обновления или удаления строк в одной таблице на основании отличий, найденных в другой таблице. Изменяемая таблица называется целевой таблицей. А таблица, используемая для определения строк, которые следует изменить, — исходной.
MERGE изменяет данные на основе одного или нескольких условий:
- Если исходные данные имеют совпадающую строку в целевой таблице, данные в целевой таблице будут обновлены.
- Если исходные данные не имеют соответствия в целевом объекте, данные будут вставлены в целевую таблицу.
- Если целевые данные не имеют совпадения в источнике, целевые данные будут удалены.
Ниже приведен общий синтаксис инструкции MERGE. Мы сопоставляем цель и источник по указанному столбцу и при наличии совпадения между целевым и исходным объектами указываем действие, которое нужно выполнить в целевой таблице. Если совпадений нет, мы указываем действие. Действие может быть операцией INSERT, UPDATE или DELETE (вставка, обновление или удаление). Этот код указывает, что инструкция UPDATE выполняется при наличии соответствия между источником и целевым объектом. А инструкция INSERT — если в источнике есть данные, которые не совпадают с данными в целевом объекте. Наконец, если в целевом объекте есть данные, которые не имеют соответствия в источнике, выполняется инструкция DELETE. Существует множество других возможных форм инструкции MERGE.
MERGE INTO schema_name.table_name AS TargetTbl
USING (SELECT <select_list>) AS SourceTbl
ON (TargetTbl.col1 = SourceTbl.col1)
WHEN MATCHED THEN
UPDATE SET TargetTbl.col2 = SourceTbl.col2
WHEN NOT MATCHED [BY TARGET] THEN
INSERT (<column_list>)
VALUES (<value_list>)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
Вы также можете использовать только необходимые элементы инструкции MERGE. Например, предположим, что база данных содержит таблицу с промежуточными обновлениями счетов, включающих в себя комбинацию исправлений существующих и новых счетов. Вы можете использовать предложения WHEN MATCHED и WHEN NOT MATCHED для обновления или вставки данных счетов в соответствии с требованиями.
MERGE INTO Sales.Invoice as i
USING Sales.InvoiceStaging as s
ON i.SalesOrderID = s.SalesOrderID
WHEN MATCHED THEN
UPDATE SET i.CustomerID = s.CustomerID,
i.OrderDate = GETDATE(),
i.PurchaseOrderNumber = s.PurchaseOrderNumber,
i.TotalDue = s.TotalDue
WHEN NOT MATCHED THEN
INSERT (SalesOrderID, CustomerID, OrderDate, PurchaseOrderNumber, TotalDue)
VALUES (s.SalesOrderID, s.CustomerID, s.OrderDate, s.PurchaseOrderNumber, s.TotalDue);