您的位置:首页 > 数据库 > Oracle

oracle——merge

2015-08-11 16:43 375 查看


一、概述  

  使用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的关联条件
WHENMATCHEDTHENmerge_update_clause--d中符合关联条件的数据用来更新s关联到的数据记录
WHENNOTMATCHEDTHENmerge_insert_clause;--d中不满足关联条件的数据插入到s数据集中


二、举例

  这里使用scott模式下的表举例:

  首先创建表并插入数据

--创建表
createtableemp_dept(
empnonumber(4)primarykeynotnull,
enamevarchar2(10),
deptnonumber(2),
deptnamevarchar2(14)
);

--插入数据
insertintoemp_dept
selecte.empno,e.ename,d.deptno,d.dname
fromempe,deptd
wheree.deptno=d.deptno
andrownum<5;


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


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

select*
from(selecte.empno,e.ename,d.deptno,d.dname
fromempe,deptd
wheree.deptno=d.deptno)s,emp_depted
whereed.empno(+)=s.empno;




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

mergeintoemp_deptd--第一数据集:被插入数据的表
using(selecte.empno,e.ename,d.deptno,d.dname
fromempe,deptd
wheree.deptno=d.deptno)s--第二数据集
on(d.empno=s.empno)--d和s表的关联
whenmatchedthen
updatesetd.ename=s.ename
whennotmatchedthen
insert(empno,ename,deptno,deptname)
values(s.empno,s.ename,s.deptno,s.dname);
commit;--必须提交事务,否则无法看到数据


  在做联合查询结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: