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;--必须提交事务,否则无法看到数据
在做联合查询结果如下:
相关文章推荐
- 深入解析Oracle学习笔记(第五章)
- oracle中的约束
- Oracle的监听(listener)到底是什么
- oracle客户端安装
- oracle中的decode的使用
- 再记录一下如何配置oracle instantclient
- Oracle无法操作只能查询:record is locked by another user
- ORACLE USERENV函数
- oracle11g 密码过期问题
- Oracle SQL优化 总结
- oracle 储存过程
- oracle join on 连接
- ORACLE PARTITION
- ORACLE11G安装教程
- oracle 真正去重效率语句
- oracle range分区表已经有了MAXVALUE 分区,如何添加分区?要不能删除MAXVALUE分区里的数据,不影响在线应用。
- ORACLE最大连接数问题
- oracle 存储过程 基础
- Oracle数据库优化
- Oracle 12C -- 在相同的列的集合上创建多个索引