SQLLab
dmlПродвинутый

MERGE

Стандартная SQL-команда «вставить или обновить» — сравнивает исходные данные с целевой таблицей и выполняет INSERT/UPDATE/DELETE в одном запросе.

Синтаксис
MERGE INTO target t
USING source s ON t.id = s.id
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT (...) VALUES (...);

Объяснение

MERGE сопоставляет строки из источника (таблица, подзапрос или CTE) со строками целевой таблицы по условию ON и, в зависимости от результата, выполняет разные действия: WHEN MATCHED — обновить или удалить существующую строку, WHEN NOT MATCHED — вставить новую. Это стандартная замена ручному upsert-паттерну «проверить существование, потом INSERT или UPDATE». В PostgreSQL MERGE появился в версии 15 — для upsert на более старых версиях используется INSERT ... ON CONFLICT (см. UPSERT).

Пример

MERGE INTO inventory i
USING incoming_shipment s ON i.sku = s.sku
WHEN MATCHED THEN
  UPDATE SET quantity = i.quantity + s.quantity
WHEN NOT MATCHED THEN
  INSERT (sku, quantity) VALUES (s.sku, s.quantity);