2016-04-22 66 views
0

更新我在兩個例子就是關於與條件DML條件DELETE/INSERT /在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有什麼關係,如DELETEUPDATE子句中的條款。 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操作有兩個部分:需要採取的操作(更新某種類型,包括插入和刪除) - 這總是隻在目標表上;以及何時採取行動 - 必須滿足什麼條件才能啓動更新。條件必須引用目標表中的某些內容,但它也引用源表。

在第一個示例中:目標表只包含員工ID和缺口。你想爲每個員工增加每個獎金1%的底薪,並且爲沒有分配獎金的員工增加一個獎勵(當沒有該員工時)。因此,您不僅可以查看目標表,還可以查看其他地方的薪資存儲位置。在這種情況下,「WHEN MATCHED」確保您查看兩個表中的同一個員工ID。然後你增加獎金1%的底薪;基本工資是從源表讀取的。然後,如果僱員的基本工資超過80,000,那麼您完全刪除獎金(BONUS表中的員工ID不會有行) - 這必須是數據庫中反映的業務決策。因此,您可以看到如何在目標表以外的地方引用數據,即使這些更改本身僅影響目標。

在你的第二個例子中,效果將是相同的。

0

在第一個示例中, 1.屬於部門80的員工被標識。這些員工在獎金錶中可能有或沒有對他們的員工ID的獎金記錄。 2.如果獎金中已經存在獎金,該員工的獎金獎金將增加1%。在那之後,如果員工的薪水超過8000,他不能有獎金,所以從獎金中刪除他的獎金記錄。 3.如果沒有獎金已經存在,並且員工工資不超過8000,則添加新的獎金記錄。

在這種情況下對於理解的目的將是對序列中,當匹配時,然後更新,WHERE,DELETE,當不匹配時,WHERE,INSERT

在第二示例中, 查詢1:如果源記錄存在在目的地, a。更新目的地描述和狀態。 b。然後,如果源狀態爲10,則從目標中刪除具有相同ID的記錄。

查詢2:如果源記錄存在於目標中,則爲 a。更新目的地描述和狀態。 b。然後從目的地刪除該記錄。

在查詢2中更新是多餘的,除非有更新其他表的觸發器。

在這種情況下,對於理解的目的將是對序列,當匹配的,然後更新,其中,DELETE

希望這有助於。