2016-04-22 2 views
0

я наткнулся на два примера относительно MERGE с условным DMLУсловный DELETE/INSERT/UPDATE в MERGE

First example,

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, как в предложении и UPDATE. Когда действуют WHERE? После сопоставления? На источнике/цели до ON?

Another related example с еще одним вопросом

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; 

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

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

ответ

0

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

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

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

0

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

Последовательность в этом случае для понимания целей будет включен, когда подобрано, а затем обновить, ГДЕ, DELETE, КОГДА НЕ MATCHED, ГДЕ ВСТАВИТЬ

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

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

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

Последовательности в этом случае для понимания целей будут включено, когда подобран, а затем обновить, ГДЕ, DELETE

Надеется, что это помогает.