Oracle Merge Into的用法详解

  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        -------------------------------------------

原文地址:https://www.cnblogs.com/qianyuliang/p/7019156.html