標籤:
一、概述
使用merge聲明從一個或者更多個表或視圖中篩選記錄,以用來更新或者插入到一個表或視圖中。你可以指定條件以決定是執行update操作還是insert操作到目標表或視圖中。
這個聲明是一個方便的方式以聯合多種操作。這樣你就避免了大量的insert/update/delete這樣的dml操作。
merge是一個deterministic語句。你不能在對同一個目標表的merge語句中多次更新。
MERGE [INTO [schema .] table [t_alias] --資料集s(只能是表)USING [schema .] { table | view | subquery } [t_alias] --資料集d(可以是表、子查詢、視圖)ON ( condition ) --s和d的關聯條件WHEN MATCHED THEN merge_update_clause --d中符合關聯條件的資料用來更新s關聯到的資料記錄WHEN NOT MATCHED THEN merge_insert_clause;--d中不滿足關聯條件的資料插入到s資料集中
二、舉例
這裡使用scott模式下的表舉例:
首先建立表並插入資料
--建立表create table emp_dept( empno number(4) primary key not null, ename varchar2(10), deptno number(2), deptname varchar2(14));--插入資料insert into emp_deptselect e.empno,e.ename,d.deptno,d.dnamefrom emp e,dept dwhere e.deptno = d.deptnoand rownum < 5;
修改表中部分ename使其和emp表中資料不同
對比emp_dept表和emp,dept表串連查詢的結果如下:
select *from (select e.empno,e.ename,d.deptno,d.dnamefrom emp e,dept dwhere e.deptno = d.deptno) s, emp_dept edwhere ed.empno(+) = s.empno;
使用merge將emp,dept表串連查詢出的結果插入到emp_dept表中
merge into emp_dept d--第一資料集:被插入資料的表using (select e.empno,e.ename,d.deptno,d.dnamefrom emp e,dept dwhere e.deptno = d.deptno) s--第二資料集on (d.empno = s.empno)--d和s表的關聯when matched then update set d.ename = s.enamewhen not matched then insert (empno,ename,deptno,deptname) values(s.empno,s.ename,s.deptno,s.dname);commit;--必須提交事務,否則無法看到資料
在做聯集查詢結果如下:
oracle——merge