Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Топовые новости
Новое

Инструкция MERGE cоветы и хитрости программирования

Инструкцию MERGE часто называют «наложением» (upsert), поскольку она позволяет в одной операции или вставить набор данных в таблицу, или, если записи уже существуют, обновить их новыми значениями.

Единственный сложный аспект инструкции MERGE — это принять саму идею обработки инструкций INSERT я UPDATE по принципу или-или.

Предположим, что у нас есть две таблицы. В таблице ЕМР хранятся сведения обо всех сотрудниках компании, которые успешно прошли 90-дневный испытательный срок при поступлении на работу. Сотрудники, входящие в таблицу ЕМР, также могут иметь несколько состояний — «работает», «не работает» и «уволен». Прием в компанию каждого нового служащего записывается в таблицу NEWJHIRE. Через 90 дней записи переносятся в таблицу ЕМР, где описываются все обычные сотрудники. Однако, поскольку наша компания каждое лето принимает практикантов из колледжа, очень вероятно, что у некоторых из наших новых сотрудников с прошлого года останутся записи в таблице ЕМР с состоянием «не работает». Эту бизнес-проблему можно описать при помощи следующего псевдокода.

Для каждой записи в таблице NEW_HIRE

Найти соответствующую запись в таблице ЕМР Если запись существует в таблице ЕМР

Обновить существующие данные в таблице ЕМР Иначе

Вставить запись в таблицу ЕМР Конец оператора Если Конец оператора Для

Мы можем написать довольно длинную хранимую процедуру, которая будет проверять все записи в таблице NEWJHIRE, а затем по условию вставлять (INSERT) в таблицу ЕМР записи о совершенно новых сотрудниках или обновлять (UPDATE) записи возвращающихся практикантов. Но следующая инструкция MERGE стандарта ANSI значительно упрощает этот процесс.

MERGE INTO emp AS e
USING (SELECT * FROM newjiire) AS n ON e.empno=n.empno
WHEN MATCHED THEN
UPDATE SET
e.ename=n.ename,
e.sal=n.sal,
e.mgr=n.mgr,
e.deptno=n.deptno
WHEN NOT MATCHED THEN
INSERT (
e.empno,
e.ename,
e.sal,
e.mgr,
e.deptno)
VALUES (
n.empno,
n.ename,
n.sal,
n.mgr,
n.deptno
);

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


DB2

Платформа DB2 поддерживает для инструкции MERGE синтаксис стандарта ANSI.


MySQL

Не поддерживается.


Oracle

Платформа Oracle поддерживает инструкцию MERGE с очень небольшими вариациями, которые почти все явно видны при сравнении схемы синтаксиса Oracle со схемой синтаксиса ANSI.

MERGE INTO [схема.] {имя_объекта | подзапрос] [псевдоним] USING

[схема.]ссылка_на_таблицу [псевдоним] ON (условие_поиска) WHEN MATCHED THEN

UPDATE SET столбец={выражение | DEFAULT > [, …] WHEN NOT MATCHED THEN

INSERT (столбец [, …]) VALUES (выражение [, …]

К различиям между стандартом ANSI и его реализацией в Oracle относятся следующие.

  • Платформа Oracle не позволяет использовать ключевое слово AS для присвоения псевдонима целевой таблице или таблице-источнику.
  • Orucle требует заключать условие рожка в скобки.
  • В предложении WHEN NOT MATCHED требуется указывать список вставляемых столбцов, хотя в стандарте ANSI это не является обязательным.

За дополнительной информацией обращайтесь к разделам «Общие правила» и «Советы и хитрости программирования».


PostgreSQL

He поддерживается.


SQL Server

He поддерживается.

Источник