• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Синхронизация Двух Таблиц В Sql Server При Помощи Оператора Merge

Sascha Оффлайн

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,368
Баллы
155
Синхронизация данных в двух таблицах не такая уж и редкая задача. Но, в ранних версиях Microsoft SQL Server не было средств для её эффективного решения без применения репликации.

Начиная с версии 2008 SQL Server поддерживает оператор слияния (MERGE), который позволяет выполнять процесс синхронизации более гибко.


Рассмотрим простой пример.

Допустим имеется таблица со списком продуктов питания (TestTable1).


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.



И есть ещё одна таблица с аналогичным списком, но несколько другими данными (TestTable2).


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.



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

Воспользуемся оператором MERGE. Данный оператор имеет следующий синтаксис:

MERGE INTO [таблица, которая синхронизируется]
USING [таблица источник данных]
ON [условие отбора]
WHEN MATCHED THEN
[действие, если запись в таблице источнике данных соответствует условию отбора]
WHEN NOT MATCHED THEN
[действие, если запись в таблице источнике данных не соответствует условию отбора];

Точка с запятой в конце запроса MERGE обязательна.

Применительно к рассматриваемому примеру MERGE запрос будет записан следующим образом:

MERGE INTO TestTable1 t1
USING (SELECT * FROM TestTable2) t2
ON t1.Gut=t2.Gut
WHEN NOT MATCHED THEN
INSERT (Gut) VALUES (t2.Gut);

Ниже показан результат его выполнения.


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.



Таким образом в первую таблицу были добавлены только те записи, которые в ней изначально отсутствовали.

Также в процессе синхронизации возможно не только добавление, но и обновление и удаление записей (оба действия запрещены в сегменте WHEN NOT MATCHED THEN без указания таблицы для сравнения).

Теперь удалим из первой таблицы записи, которых нет во второй. Только вместо продукта питания для разнообразия используем id.

MERGE INTO TestTable1 t1
USING (SELECT * FROM TestTable2) t2
ON t1.id<>t2.id
WHEN NOT MATCHED THEN
INSERT (Gut) VALUES (t2.Gut);

Результат его выполнения:


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.



Для обновления создадим третью таблицу и попытаемся обновить записи во второй таблице. Условие синхронизации – совпадение id.


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.



Запрос в данной ситуации будет выглядеть так:

MERGE INTO [dbo].[TestTable2] t2
USING (SELECT * FROM [dbo].[TestTable3]) t3
ON t2.id=t3.id
WHEN MATCHED THEN
UPDATE SET t2.Gut=t3.Gut;

Результат его выполнения:


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.



Видно, что первые три записи второй таблицы были замещены записями из третьей.

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

Напишем MERGE запрос, который будет замещать записи из таблицы 2 записями из таблицы 3, которые с ними полностью совпадают. В противном случае запрос запишет в поле Gut таблицы 2 фразу «’Отсутствует в таблице 3».

MERGE INTO [dbo].[TestTable2] t2
USING (SELECT * FROM [dbo].[TestTable3]) t3
ON ((t2.id=t3.id) AND (t2.Gut=t3.Gut))
WHEN MATCHED THEN
UPDATE SET t2.Gut=t3.Gut
WHEN NOT MATCHED BY SOURCE THEN
UPDATE SET t2.Gut='Отсутствует в таблице 3';

Результат выполнения:


Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.



Как уже было отмечено выше, при обновлении или удалении записей в сегменте WHEN NOT MATCHED THEN необходимо указывать таблицу для сравнения. Такой таблицей может выступить как таблица источник данных, так и таблица, которая синхронизируется. Но, в обоих случаях таблицы указываются при помощи ключевых слов SOURCE или TARGET соответственно.

Пример для случая с TARGET приводить не станем, так как по своей сути он аналогичен предыдущему примеру. Только сравнение в сегменте WHEN NOT MATCHED THEN будет производиться с другой таблицей.

Также возможно использование двух сегментов WHEN NOT MATCHED THEN. Один для таблицы источника данных, а другой для таблицы, которая синхронизируется.

В данной статье мы рассмотрели лишь основы синхронизации между таблицами в SQL Server при помощи оператора MERGE.

Более полные сведения можно найти в

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

или книгах: «SQL. Карманный справочник» (Генник Дж.. ) и «Microsoft SQL Server 2008. Разработка баз данных» (Тернстрем Т., Вебер Э., Хотек М. совместно с компанией GrandMasters).
 
Вверх Снизу