HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Merge относится к DML (Data Manipulation Language) языка<strong>SQL</strong>. Оператор появился с версии SQL Server 2008 и используется для того, чтобы привести 2 набора данных в соответствие - добавить строки, если их нет, обновить, если строки найдены, и удалить (опционально).</p>
1 <p>Merge относится к DML (Data Manipulation Language) языка<strong>SQL</strong>. Оператор появился с версии SQL Server 2008 и используется для того, чтобы привести 2 набора данных в соответствие - добавить строки, если их нет, обновить, если строки найдены, и удалить (опционально).</p>
2 <p>Merge можно использовать не только для того, чтобы сделать вставку или изменение данных, но с точки зрения производительности выгоднее будет вызывать классические<strong>Insert</strong>или<strong>Update</strong>.</p>
2 <p>Merge можно использовать не только для того, чтобы сделать вставку или изменение данных, но с точки зрения производительности выгоднее будет вызывать классические<strong>Insert</strong>или<strong>Update</strong>.</p>
3 <p><em>Сразу хочу сказать, что синтаксис приводится в упрощённом варианте, чтобы сначала изучить базовую функциональность, а потом уже погружаться глубже.</em></p>
3 <p><em>Сразу хочу сказать, что синтаксис приводится в упрощённом варианте, чтобы сначала изучить базовую функциональность, а потом уже погружаться глубже.</em></p>
4 MERGE &lt;target_table&gt; [AS TARGET] USING &lt;table_source&gt; [AS SOURCE] ON &lt;search_condition&gt; [WHEN MATCHED THEN &lt;merge_matched&gt; ] [WHEN NOT MATCHED [BY TARGET] THEN &lt;merge_not_matched&gt; ] [WHEN NOT MATCHED BY SOURCE THEN &lt;merge_matched&gt; ] [OUTPUT];<h2>Разберём каждую часть</h2>
4 MERGE &lt;target_table&gt; [AS TARGET] USING &lt;table_source&gt; [AS SOURCE] ON &lt;search_condition&gt; [WHEN MATCHED THEN &lt;merge_matched&gt; ] [WHEN NOT MATCHED [BY TARGET] THEN &lt;merge_not_matched&gt; ] [WHEN NOT MATCHED BY SOURCE THEN &lt;merge_matched&gt; ] [OUTPUT];<h2>Разберём каждую часть</h2>
5 <p><strong>Target table</strong>- целевая таблица, именно в ней данные будут добавлены, изменены или удалены в результате выполнения оператора.</p>
5 <p><strong>Target table</strong>- целевая таблица, именно в ней данные будут добавлены, изменены или удалены в результате выполнения оператора.</p>
6 <p><strong>Source table</strong>- исходная таблица или таблица-источник данных, с которой будет сравниваться целевая таблица, это может быть любой набор данных. Предложение<strong>USING</strong>напоминает предложение<strong>FROM</strong>из оператора<strong>SELECT</strong>, тут можно указать таблицу, подзапрос, табличное выражение или функцию, возвращающую таблицу.</p>
6 <p><strong>Source table</strong>- исходная таблица или таблица-источник данных, с которой будет сравниваться целевая таблица, это может быть любой набор данных. Предложение<strong>USING</strong>напоминает предложение<strong>FROM</strong>из оператора<strong>SELECT</strong>, тут можно указать таблицу, подзапрос, табличное выражение или функцию, возвращающую таблицу.</p>
7 <p>Далее<strong>ON</strong>- условие соединения двух таблиц (а точнее, наборов данных), такое же как ON в<strong>JOIN</strong>.</p>
7 <p>Далее<strong>ON</strong>- условие соединения двух таблиц (а точнее, наборов данных), такое же как ON в<strong>JOIN</strong>.</p>
8 <h2>Теперь посмотрим на соотношение</h2>
8 <h2>Теперь посмотрим на соотношение</h2>
9 <h2>Следующие 3 части оператора</h2>
9 <h2>Следующие 3 части оператора</h2>
10 <p><strong>When Matched</strong>- описывает действие, которое срабатывает для строк, которые нашлись и в Source, и в Target по условию, которое описано в<strong>ON</strong>. В этой части чаще всего встречается оператор<strong>UPDATE</strong>, хотя возможно использование оператора<strong>DELETE</strong>.</p>
10 <p><strong>When Matched</strong>- описывает действие, которое срабатывает для строк, которые нашлись и в Source, и в Target по условию, которое описано в<strong>ON</strong>. В этой части чаще всего встречается оператор<strong>UPDATE</strong>, хотя возможно использование оператора<strong>DELETE</strong>.</p>
11 <p><strong>When Not Matched [By Target]</strong>- описывает действие для строк, которые есть в таблице<strong>Source</strong>, но отсутствуют в таблице Target; далее используется оператор INSERT, и указанные строки добавляются в таблицу Target.</p>
11 <p><strong>When Not Matched [By Target]</strong>- описывает действие для строк, которые есть в таблице<strong>Source</strong>, но отсутствуют в таблице Target; далее используется оператор INSERT, и указанные строки добавляются в таблицу Target.</p>
12 <p><strong>When Not Matched By Source</strong>- описывает действие для строк, которые отсутствуют в таблице Source, но найдены в таблице Target, чаще всего встречается оператор DELETE, чтобы удалить строки и привести 2 набора в соответствие, но возможно использование оператора Update.</p>
12 <p><strong>When Not Matched By Source</strong>- описывает действие для строк, которые отсутствуют в таблице Source, но найдены в таблице Target, чаще всего встречается оператор DELETE, чтобы удалить строки и привести 2 набора в соответствие, но возможно использование оператора Update.</p>
13 <p>Если переложить на оператор, то получится:</p>
13 <p>Если переложить на оператор, то получится:</p>
14 <p>Например, возьмём загрузку данных о наличие книг:</p>
14 <p>Например, возьмём загрузку данных о наличие книг:</p>
15 <p>Строки 1 и 2 - произойдёт<strong>Update</strong>, строки 3 и 4 -<strong>Insert</strong>, а строка 5 - из таблицы Target будет удалена Delete.</p>
15 <p>Строки 1 и 2 - произойдёт<strong>Update</strong>, строки 3 и 4 -<strong>Insert</strong>, а строка 5 - из таблицы Target будет удалена Delete.</p>
16 <h2>И последняя часть оператора в примере</h2>
16 <h2>И последняя часть оператора в примере</h2>
17 <p><strong>OUTPUT</strong>- отличается тем, что есть специальная функция $action, которая возвращает оператор, который был применён для конкретной строки. Служебные таблицы<strong>deleted</strong>показывают данные, которые были в<strong>Target</strong>до выполнения<strong>Merge</strong>.<strong>Inserted</strong>- данные, которые возникли после применения Merge.</p>
17 <p><strong>OUTPUT</strong>- отличается тем, что есть специальная функция $action, которая возвращает оператор, который был применён для конкретной строки. Служебные таблицы<strong>deleted</strong>показывают данные, которые были в<strong>Target</strong>до выполнения<strong>Merge</strong>.<strong>Inserted</strong>- данные, которые возникли после применения Merge.</p>
18 <p>Ниже пример кода с Merge:</p>
18 <p>Ниже пример кода с Merge:</p>
19 CREATE TABLE BooksSalesStat (BookId BIGINT PRIMARY KEY, BookName VARCHAR(128), SalesCount INT); CREATE TABLE StagingBooksSalesStat (BookId BIGINT PRIMARY KEY, BookName VARCHAR(128), SalesCount INT); INSERT INTO BooksSalesStat (BookId, BookName, SalesCount) VALUES (1,'Остров Сокровищ', 4), (2,'Незнайка', 5), (5,'Алые паруса', 2); INSERT INTO StagingBooksSalesStat (BookId, BookName, SalesCount) VALUES (1,'Остров Сокровищ', 4), (2,'Незнайка', 5), (3,'Робинзон Крузо', 10), (4,'Руслан и Людмила', 12); MERGE BooksSalesStat AS Target USING StagingBooksSalesStat AS Source ON (Target.BookId = Source.BookId) WHEN MATCHED THEN UPDATE SET SalesCount = Source.SalesCount WHEN NOT MATCHED THEN INSERT VALUES (Source.BookId, Source.BookName, Source.SalesCount) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT deleted.*, $action, inserted.*;<p>Что можно почитать по Merge: 1. Ben-Gan I., Sarka D., Talmage R. - Training Kit (Exam 70-461) Querying Microsoft SQL Server 2012-2012, Глава 11. 2.<a>Документация</a>. 3.<a>Статья</a>.</p>
19 CREATE TABLE BooksSalesStat (BookId BIGINT PRIMARY KEY, BookName VARCHAR(128), SalesCount INT); CREATE TABLE StagingBooksSalesStat (BookId BIGINT PRIMARY KEY, BookName VARCHAR(128), SalesCount INT); INSERT INTO BooksSalesStat (BookId, BookName, SalesCount) VALUES (1,'Остров Сокровищ', 4), (2,'Незнайка', 5), (5,'Алые паруса', 2); INSERT INTO StagingBooksSalesStat (BookId, BookName, SalesCount) VALUES (1,'Остров Сокровищ', 4), (2,'Незнайка', 5), (3,'Робинзон Крузо', 10), (4,'Руслан и Людмила', 12); MERGE BooksSalesStat AS Target USING StagingBooksSalesStat AS Source ON (Target.BookId = Source.BookId) WHEN MATCHED THEN UPDATE SET SalesCount = Source.SalesCount WHEN NOT MATCHED THEN INSERT VALUES (Source.BookId, Source.BookName, Source.SalesCount) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT deleted.*, $action, inserted.*;<p>Что можно почитать по Merge: 1. Ben-Gan I., Sarka D., Talmage R. - Training Kit (Exam 70-461) Querying Microsoft SQL Server 2012-2012, Глава 11. 2.<a>Документация</a>. 3.<a>Статья</a>.</p>
20 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
20 <p><em>Есть вопрос? Напишите в комментариях!</em></p>
21  
21