oracle——merge

 

一、概述  

  使用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_dept
select e.empno,e.ename,d.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno
and rownum < 5;

  修改表中部分ename使其和emp表中数据不同

   对比emp_dept表和emp,dept表连接查询的结果如下:

select *
from (select e.empno,e.ename,d.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno) s, emp_dept ed
where ed.empno(+) = s.empno;

  使用merge将emp,dept表连接查询出的结果插入到emp_dept表中

merge into emp_dept d--第一数据集:被插入数据的表
using (select e.empno,e.ename,d.deptno,d.dname
from emp e,dept d
where e.deptno = d.deptno) s--第二数据集
on (d.empno = s.empno)--d和s表的关联
when matched then 
  update  set d.ename = s.ename
when not matched then 
  insert (empno,ename,deptno,deptname)
  values(s.empno,s.ename,s.deptno,s.dname);
commit;--必须提交事务,否则无法看到数据

  在做联合查询结果如下:

原文地址:https://www.cnblogs.com/brolanda/p/4721009.html