Условное DELETE/INSERT/UPDATE в MERGE

Я столкнулся с двумя примерами, касающимися MERGE с условным DML.

Первый пример,

MERGE INTO bonuses D
   USING (SELECT employee_id, salary, department_id FROM employees
   WHERE department_id = 80) S
   ON (D.employee_id = S.employee_id)
   WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
     DELETE WHERE (S.salary > 8000)
   WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
     VALUES (S.employee_id, S.salary*.01)
     WHERE (S.salary <= 8000);

Я склонен понимать, что в MERGE изменяется только целевая таблица (здесь D). Когда мы помещаем DML в WHEN, он должен воздействовать на целевую таблицу D. Итак, в этом случае, какое отношение имеют условия к S, как в предложениях DELETE и UPDATE. Когда WHERE вступают в действие? После совпадения? На источнике/цели до ON ?

Еще один связанный пример с еще одним вопросом

MERGE INTO destination d
  USING source s
    ON (s.id = d.id)
  WHEN MATCHED THEN
    UPDATE SET  d.description = 'Updated',
                d.status = 10
    DELETE WHERE s.status = 10;

и

MERGE INTO destination d
  USING source s
    ON (s.id = d.id)
  WHEN MATCHED THEN
    UPDATE SET  d.description = 'Updated',
                d.status = 10
    DELETE WHERE d.status = 10;

Я не понимаю разницы между двумя сценариями: исходной и целевой таблицей в предложении WHERE.

Заранее спасибо.


person Kenny    schedule 22.04.2016    source источник


Ответы (2)


Операция MERGE состоит из двух частей: КАКОЕ действие предпринять (обновление какого-либо вида, включая вставки и удаления) - это всегда ТОЛЬКО в целевой таблице; и КОГДА предпринимать действия — какое условие должно быть выполнено, чтобы инициировать обновление. Условие должно ссылаться на что-то в целевой таблице, но оно также ссылается на исходную таблицу.

В вашем первом примере: в целевой таблице есть только идентификаторы сотрудников и бонусы. Вы хотите увеличить каждую премию на 1% от базового оклада для каждого сотрудника - и добавить премию (когда для этого сотрудника не было строки) для сотрудников, которым вообще не была назначена премия. Таким образом, вы можете не только смотреть в целевую таблицу, вы также должны смотреть где-то еще, где хранятся зарплаты. В этом случае «WHEN MATCHED» гарантирует, что вы просматриваете один и тот же идентификатор сотрудника в обеих таблицах. Затем вы увеличиваете премию на 1% от базового оклада; Базовый оклад считывается из исходной таблицы. Затем вы полностью удаляете бонус (в таблице BONUS не будет строки для идентификатора сотрудника), если у сотрудника базовая зарплата больше 80 000 — это должно быть бизнес-решение, отраженное в базе данных. Итак, вы видите, как вам нужно ссылаться на данные в местах, отличных от целевой таблицы, хотя сами изменения влияют только на целевую.

Во втором примере эффект будет таким же.

person mathguy    schedule 22.04.2016

В первом примере 1. Идентифицируются сотрудники, принадлежащие к отделу 80. Эти сотрудники могут иметь или не иметь запись о бонусах по отношению к их идентификатору сотрудника в таблице бонусов. 2. Если надбавка в премиях уже есть, увеличить надбавку в премиях для этого работника на 1 процент от его оклада. После этого, если у работника зарплата больше 8000, у него не должно быть премий, поэтому уберите его запись о премировании из премий. 3. если премия уже не существует и зарплата сотрудников не превышает 8000, добавить новую запись о премировании.

Последовательность в этом случае для понимания будет следующей: ВКЛЮЧИТЬ, ПРИ СОВПАДЕНИИ, ЗАТЕМ ОБНОВИТЬ, ГДЕ, УДАЛИТЬ, КОГДА НЕ СООТВЕТСТВУЕТ, ГДЕ, ВСТАВИТЬ

Во втором примере запрос 1: если исходная запись существует в месте назначения, a. обновить описание и статус пункта назначения. б. Затем, если исходный статус равен 10, удалите запись с тем же идентификатором из пункта назначения.

запрос 2: если исходная запись существует в месте назначения, a. обновить описание и статус пункта назначения. б. Затем удалите эту запись из пункта назначения.

В query2 обновление является избыточным, если нет никаких триггеров, обновляющих другие таблицы.

Последовательность в этом случае для понимания целей будет ВКЛЮЧЕНА, ПРИ СОВПАДЕНИИ, ЗАТЕМ ОБНОВЛЕНИЕ, ГДЕ, УДАЛЕНИЕ

Надеюсь это поможет.

person ArtBajji    schedule 22.04.2016