SQL Merge: объединение данных в базе данных
Оператор MERGE (также известный как UPSERT или мердж) в SQL позволяет объединить операции INSERT, UPDATE и DELETE в одном запросе. Он полезен, когда вам нужно сделать следующее: вставить новую запись, если такой записи не существует; обновить существующую запись, если такая запись уже существует; и, если нужно, удалить запись.
Предположим, у нас есть две таблицы - "users" и "temp_users":
<!-- Таблица "users" -->
<table>
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>email</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>John</td>
<td>john@example.com</td>
</tr>
<tr>
<td>2</td>
<td>Alice</td>
<td>alice@example.com</td>
</tr>
</tbody>
</table>
<!-- Таблица "temp_users" -->
<table>
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>email</th>
</tr>
</thead>
<tbody>
<tr>
<td>2</td>
<td>Lisa</td>
<td>lisa@example.com</td>
</tr>
<tr>
<td>3</td>
<td>Mark</td>
<td>mark@example.com</td>
</tr>
</tbody>
</table>
Теперь, давайте рассмотрим пример использования оператора MERGE для объединения этих двух таблиц:
<pre class="hljs">MERGE INTO users AS target
USING temp_users AS source
ON (target.id = source.id)
WHEN MATCHED THEN
UPDATE SET target.name = source.name, target.email = source.email
WHEN NOT MATCHED THEN
INSERT (id, name, email) VALUES (source.id, source.name, source.email)
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
</pre>
В этом примере мы объединяем таблицы "users" и "temp_users" по полю "id". Если есть совпадение (MATCHED), то обновляем поля "name" и "email" в таблице "users" значениями из таблицы "temp_users". Если совпадения нет (NOT MATCHED), то вставляем новую запись с помощью оператора INSERT. А если запись существует в таблице "users", но не существует в таблице "temp_users" (NOT MATCHED BY SOURCE), то мы удаляем ее.
Итоговая таблица "users" после выполнения оператора MERGE будет выглядеть следующим образом:
<!-- Итоговая таблица "users" -->
<table>
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>email</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>John</td>
<td>john@example.com</td>
</tr>
<tr>
<td>2</td>
<td>Lisa</td>
<td>lisa@example.com</td>
</tr>
<tr>
<td>3</td>
<td>Mark</td>
<td>mark@example.com</td>
</tr>
</tbody>
</table>
Оператор MERGE особенно полезен при интеграции данных из разных источников или при обновлении существующих данных в таблице на основе новых данных.
В данном примере использован стандартный синтаксис оператора MERGE. Однако, следует учитывать, что синтаксис может отличаться в зависимости от используемой базы данных. Поэтому, перед использованием оператора MERGE, рекомендуется ознакомиться с документацией конкретной СУБД.