转:Oracle中merge into的使用

  最近项目上使用Oracle的Merge,所以找来一下资料学习了解。

  该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动。

  特点:

  1、insert 和update是可选的 ;  

  2、UPDATE 和INSERT 后面可以跟WHERE 子句 ;

  3、在ON条件中可以使用常量来insert 所有的行到目标表中,不需要连接到源表和目标表 ;

  4、UPDATE 子句后面可以跟delete 来去除一些不需要的行。

  举例:

  1    create table PRODUCTS   
  2     (   
  3     PRODUCT_ID INTEGER,   
  4     PRODUCT_NAME VARCHAR2(60),   
  5     CATEGORY VARCHAR2(60)   
  6     );   
  7   
  8     insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS');   
  9     insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS');   
 10     insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS');   
 11     insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS');   
 12     insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD');   
 13     commit;   
 14   
 15     create table NEWPRODUCTS   
 16     (   
 17     PRODUCT_ID INTEGER,   
 18     PRODUCT_NAME VARCHAR2(60),   
 19     CATEGORY VARCHAR2(60)   
 20     );   
 21   
 22     insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS');   
 23     insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS');   
 24     insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS');   
 25     insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS');   
 26     commit;   
 27 1,可省略的update 或者insert
 28       MERGE INTO products p   
 29     2 USING newproducts np   
 30     3 ON (p.product_id = np.product_id)   
 31     4 WHEN MATCHED THEN  
 32     5 UPDATE  
 33     6 SET p.product_name = np.product_name,   
 34     7 p.category = np.category;
 35   使用表newproducts中的product_name 和category字段来更新表products 中相同product_id的product_name 和category.
 36 
 37 2,当条件不满足的时候把newproducts表中的数据INSERT 到表products中。
 38 
 39     MERGE INTO products p   
 40     USING newproducts np   
 41      ON (p.product_id = np.product_id)   
 42      WHEN NOT MATCHED THEN  
 43      INSERT  
 44      VALUES (np.product_id, np.product_name,   
 45      np.category);   
 46 3,带条件的insert 和update
 47 
 48  MERGE INTO products p   
 49  USING newproducts np   
 50    ON (p.product_id = np.product_id)   
 51    WHEN MATCHED THEN  
 52    UPDATE  
 53    SET p.product_name = np.product_name   
 54    WHERE p.category = np.category;
 55  insert 和update 都带有where 字句
 56 
 57 
 58  
 59 MERGE INTO products p   
 60  USING newproducts np   
 61     ON (p.product_id = np.product_id)   
 62     WHEN MATCHED THEN  
 63     UPDATE  
 64      SET p.product_name = np.product_name,   
 65      p.category = np.category   
 66     WHERE p.category = 'DVD'  
 67     WHEN NOT MATCHED THEN  
 68      INSERT  
 69      VALUES (np.product_id, np.product_name, np.category)   
 70     WHERE np.category != 'BOOKS'  
 71 4,无条件的insert
 72 
 73 MERGE INTO products p   
 74  USING newproducts np   
 75   ON (1=0)   
 76   WHEN NOT MATCHED THEN  
 77    INSERT  
 78    VALUES (np.product_id, np.product_name, np.category)   
 79    WHERE np.category = 'BOOKS'  
 80 5delete 子句
 81 
 82   merge into products p
 83   2  using newproducts np
 84   3  on(p.product_id = np.product_id)
 85   4  when matched then
 86   5  update
 87   6  set p.product_name = np.product_name
 88   7  delete where category = 'macle1_cate';
 89 
 90 select *
 91 
 92 from products;
 93 
 94  PRODUCT_ID PRODUCT_NAME         CATEGORY
 95 --------------------------------------- -------------------- --------------------
 96                                    1502 macle22              macle2_cate
 97                                    1503 macle3                macle2_cate
 98                                    1504 macle                  macle1_cate
 99                                    1505 macle5                macle5_cate
100 
101 1504 中的macle1_cate 满足delete where,但是不满足 on 中的条件,所以没有被删除。!!!!!!

  在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插入(Insert)。

  Merge格式:

1 MERGE INTO table_name alias1 
2 USING (table|view|sub_query) alias2
3 ON (join condition) 
4 WHEN MATCHED THEN 
5     UPDATE table_name 
6     SET col1 = col_val1, 
7         col2     = col2_val 
8 WHEN NOT MATCHED THEN 
9     INSERT (column_list) VALUES (column_values);

  用中文来解释Merge语法,就是:

  在alias2中Select出来的数据,每一条都跟alias1进行 ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。

posted @ 2016-03-08 22:18  ngulc  阅读(725)  评论(0编辑  收藏  举报