为了方便大家学习和测试,所有的例子都是在Oracle自带用户Scott下建立的。
MERGE是什么?这么厉害的东西你都不知道,你这学生是怎么学习的?老师不给你讲你就不会自学了吗?哎!可怜天下老师心啊,罢了罢了,老师现在给你好好讲一下吧。
MERGE是Oracle9i新增的语法,中文意思是“合并”,那合并什么呢?它能合并INSERT和UPDATE在一条SQL语句中执行,是不是很牛X?!还有更牛X的,就是在执行该条语句时只做一次全表扫描,效率非常高。是不是有点心痒难耐了,哈哈,不着急,老师接下来给你具体讲讲它的用法。不过在讲之前我们需要做两点准备工作:
一、创建测试表且填充测试数据
- create table merge_test as select * from scott.dept
- delete from merge_test t where t.deptno=10
- update merge_test t set t.dname = 'TEST'
这个太简单了,执行下面的两条SQL语句不就可以了?!
- delete from merge_test
- insert into merge_test select * from scott.dept
有!有!有!先把scott.dept表中的字段dname值更新到表merge_test的字段dname。
- update merge_test m
- set dname =
- (select dname from scott.dept t where m.deptno = t.deptno)
- insert into merge_test m
- select *
- from scott.dept
- where deptno not in (select deptno from merge_test)
- merge into merge_test m using scott.dept t on(m.deptno = t.deptno) when
- matched then update set m.dname = t.dname when not matched then insert values(t.deptno, t.dname, t.loc)
一些聪明的同学可能会问了,只能全表操作吗?可不可以根据筛选条件来操作呢?这样的同学真让人省心,你说老师能不喜欢吗?!针对这个问题,答案是肯定的,比如我只想更新deptno=20的部门名称,修改后的SQL语句如下:
- merge into merge_test m using scott.dept t on(m.deptno = t.deptno) when
- matched then update set m.dname = t.dname
- where (m.deptno = 20) when not matched then insert values(t.deptno, t.dname, t.loc)
- merge into merge_test m using scott.dept t on(m.deptno = t.deptno) when
- matched then update set m.dname = t.dname delete
- where (m.deptno = 20) when not matched then insert values(t.deptno, t.dname, t.loc)
备注:where与delete的语法是Oracle10i新增的。
原文地址:http://blog.csdn.net/fu0208/article/details/8812536