用途
Merge 命令可以用來用一個表中的資料來修改或者插入到另一個表。插入或者修改的操作取決於ON子句的條件。
該語句可以在同一語句中執行兩步操作,可以減少執行多條INSERT 和UPDATE語句。
MERGE是一個確定性語句,即不會在同一條MERGE語句中去對同一條記錄多次做修改操作。
文法
其中,merge_update_clause::=
其中,merge_insert_clause::=
關鍵字、參數
INTO 子句
在INTO子句中指定所要修改或者插入資料的目標表
USING 子句
在USING子句中指定用來修改或者插入的資料來源。資料來源可以是表、視圖或者一個子查詢語句。
ON 子句
在ON子句中指定執行插入或者修改的滿足條件。在目標表中合格每一行,ORACLE用資料來源中的相應資料修改這些行。對於不滿足條件的那些行,ORACLE則插入資料來源中相應資料。
WHEN MATCHED | NOT MATCHED
用該子句通知ORACLE如何對滿足或不滿足條件的結果做出相應的操作。可以使用以下的兩類子句。
merge_update
子句
MERGE_UPDATE子句執行對目標表中的欄位值修改。當在符合ON子句條件的情況下執行。如果修改子句執行,則目標表上的修改觸發器將被觸發。
限制:當修改一個視圖時,不能指定一個DEFAULT值
merge_insert
子句
MERGE_INSERT子句執行當不符合ON子句條件時,往目標表中插入資料。如果插入子句執行,則目標表上插入觸發器將被觸發。
限制:當修改一個視圖時,不能指定一個DEFAULT值
範例
MERGE 範例
下面的例子在OE模式下建立一個BONUSES表,BONUS的預設值為100。然後插入BONUSES表所有有成績的銷售人員(基於OE_ORDERS表的SQLES_REP_ID欄位)。最後,人力資源管理員決定,所有的人員將得到分紅。沒有銷售成績的員工得到工資的1%的分紅,而那些有銷售成績的員工將得到預設分紅以及工資的1%。可以用一條MERGE語句將完成上述修改:
CREATE TABLE bonuses (employee_id NUMBER, bonus NUMBER DEFAULT 100);
INSERT INTO bonuses(employee_id)
(SELECT e.employee_id FROM employees e, orders o
WHERE e.employee_id = o.sales_rep_id
GROUP BY e.employee_id);
SELECT * FROM bonuses;
EMPLOYEE_ID BONUS
----------- ----------
153 100
154 100
155 100
156 100
158 100
159 100
160 100
161 100
163 100
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
WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
VALUES (S.employee_id, S.salary*0.01);
EMPLOYEE_ID BONUS
----------- ----------
153 180
154 175
155 170
156 200
158 190
159 180
160 175
161 170
163 195
157 95
145 14
170 96
179 62
152 90
169 100