標籤:
Merge用來從一個表中選擇一些資料更新或者插入到另一個表中。而最終是用更新還是用插入的方式取決於該語句中的條件。下面我們簡單的舉一個例子: SQL> create table merge_test1(a number,b varchar2(20))表已建立。SQL> create table merge_test2(a number,b varchar2(20))表已建立。SQL> insert into merge_test1 values(1,‘A‘);已建立 1 行。SQL> insert into merge_test1 values(2,‘B‘);已建立 1 行。SQL> insert into merge_test1 values(3,‘C‘);已建立 1 行。SQL> insert into merge_test2 values(3,‘C‘);已建立 1 行。SQL> insert into merge_test2 values(2,‘C‘);已建立 1 行。SQL> commit;提交完成。 SQL> select * from merge_test1; A B---------- -------------------- 1 A 2 B 3 CSQL> select * from merge_test2; A B---------- -------------------- 3 C 2 C前面的準備工作之後,用Merge對 Merge_test2進行更新 MERGE INTO MERGE_TEST2 MUSING MERGE_TEST1 NON (M.A = N.A)WHEN MATCHED THEN UPDATE SET M.B = N.BWHEN NOT MATCHED THEN INSERT (M.A,M.B) VALUES (N.A,N.B); 更新後結果:SQL> select * from merge_test2; A B---------- -------------------- 1 A 3 C 2 B 總結:一、Merge 的用法大致上有三種:1、只更新不插入Merge into Merge_test2 MUsing Merge_test1 NON (M.A = N.A)WHEN MATCHED THENUPDATE SET M.B = N.B;2、只插入不更新MERGE INTO merge_test2 MUSING merge_test1 NON (M.A =N.A) WHEN NOT MATCHED THENINSERT (M.A,M.B) VALUES(N.A,N.B);3、既插入也更新MERGE INTO merge_test2 MUSING merge_test1 NON(M.A = N.A)WHEN MATCHED THENUPDATE SET M.B=N.BWHEN NOT MATCHED THENINSERT (M.A,M.B) VALUES(N.A,N.B) 二、注意事項1、merge語句中,update不能用於更新串連的列(即ON(M.A = N.A))例如:MERGE INTO merge_test2 MUSING merge_test1 NON(M.A = N.A)WHEN MATCHED THENUPDATE SET M.A=N.B ,M.B=N.BWHEN NOT MATCHED THENINSERT (M.A,M.B) VALUES(N.A,N.B) 我們執行上面的語句(注意紅色部分)就會有如下的提示:第 3 行出現錯誤:ORA-38104: 無法更新 ON 子句中引用的列: "M"."A" 2、Using 後面不一定是表: 文法文檔上寫著:table,view,subquery 也就是說也可以是一個查詢語句的結果集。 3、還有一種錯誤就是由於關聯的值不唯一引起的比如:在merge_test1中再插入一條資料。與之前的重複了!SQL> insert into merge_test1 values(3,‘d‘); 此時我們執行MERGE INTO merge_test2 MUSING merge_test1 NON(M.A = N.A)WHEN MATCHED THENUPDATE SET M.B=N.BWHEN NOT MATCHED THENINSERT (M.A,M.B) VALUES(N.A,N.B)第 1 行出現錯誤:ORA-30926: 無法在源表中獲得一組穩定的行
Oracle之Merge用法