1. MERGE INTO 的用途
MERGE INTO 是Oracle 9i以后才出现的新的功能。那这个功能 是什么呢?
简单来说,就是:“有则更新,无则插入”
从这句话里,应该可以理解到,merge into 操作一个对象'A'的时候,要有另外一个结果集做为源数据 'B'.
‘merge into’ 将B中的数据与A中的数据按照一定条件'C'进行对比,如果 A中数据满足C条件,则进行update操作,如果不满足条件 'C',则进行insert操作。(请注意这种对应关系)
2、 语法结构
MERGE [INTO] [schema.]table [alias]
USING {[schema.]table|views|query} [alias]
ON {condition}
WHEN MATCHED THEN UPDATE SET {clause}
WHEN NOT MATCHED THEN INSERT VALUES {clause}
可以用于单条数据的处理,也可以用于数据的批处理。对于merge into来说效率要比单独执行update+insert 操作效率要高。
但是请注意,using语句中的结果集 B不可以与merge into 的对象A相同,否则,会因为结果集A,B恒等。
当 on() 进行等值判断时,只可以进行update操作,不能进行insert 操作,当 on() 进行不等值判断时,只可以进行insert操作,不能进行update操作。
可能这样说还不是很清楚。下面我们实际操作演示,就会理解清楚了。
3. 测试 MERGE INTO
--------------------------------------------------------------------------------------------------------------
------------------------------------- 创建测试表--TEST1 ----------------------------------
1 CREATE TABLE TEST1(
2 USERID NUMBER,
3 ID NUMBER
4 );
Table created
--------------------------------------------------------------------------------------------------------------
---------------------------------- 填充测试数据 -------------------------------
1 begin
2 for i in 100..110
3 loop
4 insert into test1 values(i,(i+100)/10);
5 end loop;
6 end;
7 /
--------------------------------------------------------------------------------------------------------------
----------------------------- 创建测试表--TEST2 、TEST3 --------------------------------
1 create table test2 as
2 select userid,trunc(id,-1) id2 from test1 where length(id)=4;
3
4 insert into test2 values('110','30');
1 create table test3
2 as
3 select userid,id id3 from test1 where length(id) <> 4;
--------------------------------------------------------------------------------------------------------------
----------------------------------- 测试MERGE INTO -----------------------------------
1 MERGE INTO test3 t
2 USING (SELECT userid,id2 FROM test2) tw
3 ON (t.userid = tw.userid)
4 WHEN MATCHED THEN UPDATE SET t.id3=tw.id2
5 WHEN NOT MATCHED THEN INSERT VALUES(tw.userid,tw.id2);
--测试完成,我们看到,test2表中的数据全部加到test3表中,而且更新了一条数据 userid=‘110’
PS:
on(condition_clause)这里的条件句中,可以使用=,>,< 等比较运算符。
------------------------------------- The End -------------------------------------------