MERGE в Oracle SQL — как объединить INSERT и UPDATE

🟢MERGE в Oracle SQL. Введение

Когда нужно обновить строки, если они существуют, или вставить новые, если их нет, чаще всего применяют два запроса: UPDATE, а затем INSERT. Однако Oracle предлагает более элегантное решение: оператор MERGE, который объединяет обе операции в одном SQL-выражении. Это особенно полезно при синхронизации данных между таблицами или при импорте данных из внешних источников.


🔤 Написание

sql
MERGE INTO целевая_таблица t
USING источник s
ON (условие_соответствия)
WHEN MATCHED THEN
UPDATE SET ...
WHEN NOT MATCHED THEN
INSERT (...) VALUES (...);

🔄 Где часто используется

  • В ETL-обработке и загрузке данных

  • При обновлении справочников и кэшей

  • В миграциях и интеграции данных между системами

  • В Data Warehousing

  • В автоматических механизмах обновления записей


🧪 10 Примеров использования с пояснениями

1️⃣ Базовое объединение INSERT и UPDATE

sql
MERGE INTO employees e
USING (SELECT 101 AS id, 'Ivan' AS name FROM dual) s
ON (e.id = s.id)
WHEN MATCHED THEN
UPDATE SET e.name = s.name
WHEN NOT MATCHED THEN
INSERT (id, name) VALUES (s.id, s.name);

Если сотрудник с ID 101 найден — обновим имя, если нет — добавим.


2️⃣ MERGE из одной таблицы в другую

sql
MERGE INTO target_table t
USING source_table s
ON (t.id = s.id)
WHEN MATCHED THEN
UPDATE SET t.value = s.value
WHEN NOT MATCHED THEN
INSERT (id, value) VALUES (s.id, s.value);

Обновление или вставка из другой таблицы.


3️⃣ MERGE с дополнительным условием внутри блока

sql
WHEN MATCHED THEN
UPDATE SET salary = salary + 500
WHERE department_id = 10

Дополнительная фильтрация при обновлении.


4️⃣ Мёрдж только с INSERT

sql
MERGE INTO employees e
USING new_employees s
ON (e.id = s.id)
WHEN NOT MATCHED THEN
INSERT (id, name) VALUES (s.id, s.name);

Добавляем только тех, кто отсутствует.


5️⃣ MERGE только с UPDATE

sql
MERGE INTO employees e
USING update_source s
ON (e.id = s.id)
WHEN MATCHED THEN
UPDATE SET e.salary = s.salary;

Обновляем только существующих.


6️⃣ MERGE с DUAL — одиночная синхронизация

sql
MERGE INTO config c
USING (SELECT 'version' AS key, '2.0' AS val FROM dual) s
ON (c.key = s.key)
WHEN MATCHED THEN
UPDATE SET c.val = s.val
WHEN NOT MATCHED THEN
INSERT (key, val) VALUES (s.key, s.val);

Обновление или добавление конфигурационного параметра.


7️⃣ Мэердж с RETURNING INTO

sql
MERGE INTO employees e
USING (SELECT 1 AS id, 'Max' AS name FROM dual) s
ON (e.id = s.id)
WHEN NOT MATCHED THEN
INSERT (id, name) VALUES (s.id, s.name)
RETURNING id INTO :new_id;

Получаем ID вставленной строки.


8️⃣ MERGE с обработкой нескольких полей

sql
MERGE INTO products p
USING updates u
ON (p.product_id = u.product_id)
WHEN MATCHED THEN
UPDATE SET p.name = u.name, p.price = u.price
WHEN NOT MATCHED THEN
INSERT (product_id, name, price)
VALUES (u.product_id, u.name, u.price);

Комплексное обновление записей.


9️⃣ MERGE с дополнительными логическими условиями

sql
WHEN MATCHED THEN
UPDATE SET status = 'ACTIVE'
WHERE s.last_login > SYSDATE - 30

Обновляем только активных пользователей.


🔟 MERGE с отслеживанием обновлений через флаг

sql
UPDATE SET last_updated = SYSDATE

Добавляем поле для регистрации даты изменения.


🧩 Заключение

MERGE — это мощный оператор, который объединяет логику вставки и обновления в одной конструкции. Это делает SQL-запросы более читаемыми, производительными и безопасными, особенно при работе с большими наборами данных.

💡 Запомни:

  • MERGE нужен, когда нужно «обновить или вставить»

  • Экономит код и запросы

  • Поддерживает условия WHEN MATCHED и WHEN NOT MATCHED

  • Работает с таблицами и DUAL

  • Отлично подходит для ETL и репликации


🔜 Следующая статья:

CONNECT_BY_ISLEAF в Oracle SQL — как определить конечные узлы в иерархических запросах


 

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии