T sql merge: MERGE (Transact-SQL) — SQL Server

Пример MERGE в MSSQL T-SQL


  • Новые

  • Лучшие

  • Все
Пример MERGE в MSSQL T-SQL

MS SQL — по необходимости

Простой пример MERGE для TSQL.

В примере подразумевается, что мы оперируем двумя одинаковыми по структуре таблицами (в реальной жизни это условие вовсе не обязательно).

Таблицы TargetTableи SourceTable — состоят всего из двух полей:
Id — некий идентификатор.
Name — Название объекта.

В примере ниже мы проверяем для всех записей из SourceTable — существует ли в таблице TargetTable запись с аналогичным Id и если существует, то меняем для этой записи поле Name в TargetTable, а если не существует то добавляем запись в TargetTable из SourceTable целиком.


MERGE TargetTable AS target  -- таблица которую будем менять, таблица приемник

USING (SELECT Id, Name FROM SourceTable) AS source 

ON (target.Id = source.Id)  -- условие по которому сопоставляем источник и приемник

WHEN MATCHED AND target.Name!=source.Name -- Если такой уже есть, то проверяем не совпадает ли Name и если не совпадает то меняем

    THEN UPDATE SET target.Name = source.Name -- обновляем

WHEN NOT MATCHED  -- если такого Id нет в таблице target то добавляем

    THEN INSERT VALUES(source.Id, source.Name) -- добавление записи

Вот и всё.



MSSQL
TSQL
merge
SQL
пример
примеры


  • Популярное

Установка русской кодировки на уже созданную базу данных (смена COLLATION)

Полезный пример изменения кодировки (COLLATION) на уже созданной базе данных. В данном примере устан (читать далее…)


518  


Курсоры в MSSQL — перебор выборки в цикле.

Команды манипулирования данными SELECT, UPDATE, DELETE работают сразу с группами строк. Эти группы, (читать далее…)


482  


Чистка логов базы данных MSSQL

Вообще процесс чистки логов должен проходить планово, и следить за этим и настраивать должен професс (читать далее…)


233  


MSSQL — передача таблицы или списка значений в процедуру ( C# .

NET )

Часто бывает необходимость передать за один раз некоторый набор данных в процедуру, в этой публикаци (читать далее…)


149  


Получение полей таблицы в MSSQL — TSQL

Этот запрос возвращает набор полей таблицы со всеми характеристиками. Метод также применим и замечат (читать далее…)


91  

Оператор MERGE

  • Добавить комментарий

Оценить

  • 1
  • 2
  • 3
  • 4
  • 5

(2 голоса)

SQL Server 2008 вводит SQL-оператор merge. Этот оператор объединяет последовательность условных команд insert и update в одном атомарном операторе в зависимости от существования записи.

Основной областью приложения оператора merge является хранилище данных, где нужно периодически обновлять таблицы с учетом вновь приходящих данных от систем оперативной обработки транзакций (OLTP, online transaction processing). Эти новые данные могут содержать изменения для существующих строк таблиц и/или новые строки, которые нужно добавить. Если строка в новых данных соответствует элементу, который уже существует в таблице, то выполняется оператор update. В противном случае выполняется оператор insert.

В версиях, предшествующих SQL Server 2008, эти операции выполнялись либо как последовательность операторов insert и update, либо как пакеты, где для каждой строки принималось решение, добавлять или изменять данные. Применение обеих этих техник имеет недостатки производительности: первой требуется множественное сканирование данных, а вторая оперирует по принципу «запись за записью». При расширении Transact-SQL новым оператором SQL Server 2008 преодолевает недостатки предыдущих подходов и упрощает реализацию приложений хранения данных.

Примеры 7.22 и 7.23 демонстрируют использование оператора merge.

 

 

В примере 7.22 создается таблица bonus, которая содержит одну строку (pi, 100). Эта таблица может быть использована для слияния.

 

 

Оператор merge в примере 7.23 изменяет данные в таблице bonus в зависимости от существования значений в столбце ргпо. Если значение столбца projectno таблицы project появляется в столбце ргпо таблицы bonus, ветвь matched будет выполнена и существующее значение будет изменено. В противном случае будет выполняться ветвь not matched и соответствующий оператор insert добавит новую строку в таблицу bonus.


Подробнее в этой категории: « Оператор INSERT Резюме к изменение содержимого таблиц »

Резюме к изменение содержимого таблиц
Оператор INSERT
Добавление одной строки
Добавление множества строк
Конструкторы значений таблицы и оператор INSERT

Добавить комментарий

Вернуться вверх

4 способа повысить производительность оператора SQL MERGE | Мин | Наука о данных с Mingyang LI

Оператор MERGE может ВСТАВЛЯТЬ, ОБНОВЛЯТЬ и УДАЛИТЬ записи в одной транзакции, что делает его более удобным для чтения и более эффективным, чем использование трех отдельных операторов. Однако с удобством приходит сложность. Оптимизация операторов MERGE может быть сложной задачей.

Photo by Sunder Muthukumaran на Unsplash

Предположим, оператор MERGE имеет форму:

 MERGE target AS TARGET 
ИСПОЛЬЗОВАНИЕ ИСТОЧНИКА В КАЧЕСТВЕ ИСТОЧНИКА
ПРИ УСЛОВИИ
ЕСЛИ СООТВЕТСТВУЕТ, ТОГДА ОБНОВИТЬ
ЕСЛИ НЕ СООТВЕТСТВУЕТ ПО ЦЕЛИ, ТОГДА ВСТАВИТЬ
ЕСЛИ ИСТОЧНИК НЕ СООТВЕТСТВУЕТ, ТОГДА УДАЛИТЬ;

Вам абсолютно необходимо MERGE? Вы можете подвергнуть сомнению мой выбор формы, утверждая, что «но мне не нужно обновлять/вставлять/удалять [выберите два] любую запись; Я просто хочу вставить/удалить/обновить [выберите один]». Если это так, рассмотрите возможность использования инструкции языка манипулирования данными (DML) нижнего уровня (а именно, INSERT/DELETE/UPDATE). При неправильном использовании операторы MERGE могут ухудшить производительность, а не улучшить ее. Используйте с осторожностью.

Есть несколько возможностей для улучшения:

Создание индексов . Убедитесь, что столбцы, указанные в условии , правильно проиндексированы. Как и все индексы, по возможности делайте их уникальными, чтобы упростить сравнение.

Следует ли группировать индексы? Хотя для таблицы SOURCE нет особых предпочтений, индекс в таблице TARGET предпочтительно должен быть кластеризован. (Этот трюк явно рекомендуется в документации Transact-SQL и SQL Server 2008 R2.)

Кластерный индекс физически сортирует записи, упрощая вставку/обновление/удаление таблицы. Вот хорошая аналогия: словарь — это таблица, записи которой имеют кластеризованный индекс, потому что он отсортирован в алфавитном порядке по словам. С другой стороны, некластеризованный указатель подобен обычному указателю в конце книги, который оставляет содержание книги нетронутым.

Под словарем можно понимать базу данных с кластеризованным индексом ее записей. Фото Ромена Виньеса на Unsplash

Отдельная фильтрация от сопоставления . Убедитесь, что условие сравнивает только столбцы в двух таблицах (например, target.user_id=source.u_id ), а не столбец с константой (например, source.account_status='ACTIVE' ) . Для сравнения между столбцами и константами используйте предложение WHEN .

Использовать подсказки запроса . Для некоторых механизмов SQL могут помочь указания подсказок запроса. Например, когда мы уверены, что какой-то индекс idx1 будет иметь меньше совпадений по сравнению с каким-то другим индексом, мы можем намекнуть движку на IGNORE INDEX (idx1) .

Прочитать план запроса . Мы можем узнать больше о способах повышения производительности, прочитав план запроса. Вы можете обнаружить, что порядок соединения таблиц или тип цикла могут быть не идеальными для вашего варианта использования. Например, избегая правильных внешних соединений, инженеры Vertica сократили MERGE с 30 секунд до 2. Они также предоставили сценарий для оптимизации данных 9 секунд.0022 MERGE заявление.

Надеюсь, это поможет! Дайте мне знать в комментариях, если у вас есть другие идеи, как ускорить выполнение операторов MERGE — очень ценно!

(Первоначально опубликовано на моей личной вики.)

Слияние SQL | Примеры и синтаксис оператора слияния в SQL

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

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

Синтаксис слияния SQL

Синтаксис оператора MERGE в SQL показан ниже:

MERGE <целевая таблица> [AS TARGET]
ИСПОЛЬЗОВАНИЕ <исходной таблицы> [КАК ИСТОЧНИК]
ON <условие_поиска>
[WHEN MATCHED
THEN <объединить совпадающие записи>]
[КОГДА НЕ СООТВЕТСТВУЕТ [ПО ЦЕЛИ]
THEN <выполнить операции слияния, если соответствующая запись не найдена в целевой таблице> ]
[WHEN NOT MATCHED BY SOURCE
THEN <выполнять операции слияния, когда совпадающая запись не найдена в исходной таблице>];

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

В приведенном выше синтаксисе целевая таблица — это имя таблицы, над которой должны выполняться операции при появлении результатов сравнения условий. Исходная таблица — это имя таблицы, изменения которой будут действовать как событие, вызывающее изменения в целевой таблице путем выполнения оператора слияния. Условием поиска может быть несколько условий, разделенных логическими операторами, такими как И и ИЛИ, аналогичными спецификации условия в предложении on объединенного оператора. Далее в результате заданных условий поток будет переведен либо в совпавший кейс, либо в не совпавший кейс по цели или источнику, и выполнит нужные операции.

Примеры слияния SQL

Давайте разберемся с реализацией оператора слияния на примере. Всякий раз, когда используется оператор слияния, необходимо идентифицировать исходную таблицу, целевую таблицу и операции, которые необходимо выполнять с целевой таблицей всякий раз, когда в исходный оператор вносятся изменения. Рассмотрим две существующие таблицы с именами Articles и Updated Articles, содержимое и структура которых соответствуют выводам следующего оператора запроса:

ВЫБЕРИТЕ * ИЗ статей;

Выполнение приведенного выше оператора запроса дает вывод, который показан ниже:

SELECT * FROM UpdatedArticles;

Выполнение приведенного выше оператора запроса дает результат, который показан ниже:

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

Оператор слияния можно использовать, рассматривая статьи как целевую таблицу, а обновленные статьи как исходную таблицу. Мы можем выполнить объединение и сопоставление на основе уникальных столбцов первичного ключа обеих таблиц с именем article id и решить, соответствует ли запись или нет, сопоставив содержимое этого столбца обеих таблиц. Действия, которые необходимо выполнить при сравнении записей, указаны ниже:

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

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

ОБЪЕДИНИТЬ Статьи КАК ЦЕЛИ
ИСПОЛЬЗОВАТЬ UpdatedArticles КАК ИСТОЧНИК
ON (TARGET.ArticleID = SOURCE.ArticleID)
ПРИ СООТВЕТСТВИИ И TARGET.ArticleTopic <> SOURCE.ArticleTopic OR TARGET.Rate <> SOURCEPDATE.Rate
THEN URGET SET.Rate. ArticleTopic = SOURCE.ArticleTopic, TARGET.Rate = SOURCE.Rate
ЕСЛИ НЕ СООТВЕТСТВУЕТ ПО ЦЕЛЕВОМУ
THEN INSERT (ArticleID, ArticleTopic, Rate) ЗНАЧЕНИЯ (ИСТОЧНИК.0007 THEN DELETE
OUTPUT $ACTION,
DELETED. ArticleID AS TargetArticleID,
DELETED.ArticleTopic AS TargetArticleTopic,
DELETED.Rate AS TargetRate,
INSERTED.ArticleID AS SourceArticleID,
INSERTED.ArticleTopic AS SourceArticle0Topic,
INSERTED.ArticleTopic AS Source0Topic, INSERTED.ArticleTopic AS90Topic0;
ВЫБЕРИТЕ @@ROWCOUNT;
GO

Выполнение приведенного выше оператора запроса дает результат, который показан ниже: исходная таблица была обновлена ​​в целевой таблице путем выполнения запроса на обновление целевой таблицы. Для идентификатора 4 в исходной таблице обновленных статей не было записи, поэтому она была удалена из целевой таблицы, а для идентификатора 5 в обновленные статьи целевой таблицы была вставлена ​​новая запись, поскольку в ней не было такой записи.

Заключение

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