`
郑云飞
  • 浏览: 796801 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle merge的用法

 
阅读更多

MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。

  通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,

  连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。

  这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。

语法

MERGE [INTO [schema .] table [t_alias]

  USING [schema .] { table | view | subquery } [t_alias]

  ON ( condition )

  WHEN MATCHED THEN merge_update_clause

  WHEN NOT MATCHED THEN merge_insert_clause;

 

 

1、UPDATE或INSERT子句是可选的
2、UPDATE和INSERT子句可以加WHERE子句
3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
首先创建示例表: 

create table PRODUCTS 
      ( 
      PRODUCT_ID INTEGER, 
      PRODUCT_NAME VARCHAR2(60), 
      CATEGORY VARCHAR2(60) 
      ); 

      insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS'); 
      insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS'); 
      insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS'); 
      insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS'); 
      insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD'); 
      commit; 

 

 create table NEWPRODUCTS 
      ( 
      PRODUCT_ID INTEGER, 
      PRODUCT_NAME VARCHAR2(60), 
      CATEGORY VARCHAR2(60) 
      ); 

      insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS'); 
      insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS'); 
      insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS'); 
      insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS'); 
      commit; 

 

     

1、可省略的UPDATE或INSERT子句
在Oracle 9i, MERGE语句要求你必须同时指定INSERT和UPDATE子句.而在Oracle 10g, 你可以省略UPDATE或INSERT子句中的一个. 下面的例子根据表NEWPRODUCTS的PRODUCT_ID字段是否匹配来updates表PRODUCTS的信息: 

SQL> MERGE INTO products p 
      2 USING newproducts np 
      3 ON (p.product_id = np.product_id) 
      4 WHEN MATCHED THEN 
      5 UPDATE 
      6 SET p.product_name = np.product_name, 
      7 p.category = np.category; 

      3 rows merged. 

 

 

     

 SQL> SELECT * FROM products; 

      PRODUCT_ID PRODUCT_NAME CATEGORY 
      ---------- -------------------- ---------- 
      1501 VIVITAR 35MM ELECTRNCS 
      1502 OLYMPUS CAMERA ELECTRNCS 
      1600 PLAY GYM TOYS 
      1601 LAMAZE TOYS 
      1666 HARRY POTTER TOYS 
      SQL> 
      SQL> ROLLBACK; 
      Rollback complete. 
      SQL> 

 

在上面例子中, MERGE语句影响到是产品id为1502, 1601和1666的行. 它们的产品名字和种 类被更新为表newproducts中的值. 下面例子省略UPDATE子句, 把表NEWPRODUCTS中新的PRODUCT_ID插入到表PRODUCTS中, 对于在两个表中能够匹配上PRODUCT_ID的数据不作任何处理. 从这个例子你能看到PRODUCT_ID=1700的行被插入到表PRODUCTS中. 

SQL> MERGE INTO products p 
      2 USING newproducts np 
      3 ON (p.product_id = np.product_id) 
      4 WHEN NOT MATCHED THEN 
      5 INSERT 
      6 VALUES (np.product_id, np.product_name, 
      7 np.category); 

      1 row merged. 

 

 SQL> SELECT * FROM products; 

      PRODUCT_ID PRODUCT_NAME CATEGORY 
      ---------- -------------------- ---------- 
      1501 VIVITAR 35MM ELECTRNCS 
      1502 OLYMPUS IS50 ELECTRNCS 
      1600 PLAY GYM TOYS 
      1601 LAMAZE TOYS 
      1666 HARRY POTTER DVD 
      1700 WAIT INTERFACE BOOKS 

 

 

     2、带条件的Updates和Inserts子句
你能够添加WHERE子句到UPDATE或INSERT子句中去, 来跳过update或insert操作对某些行的处理. 下面例子根据表NEWPRODUCTS来更新表PRODUCTS数据, 但必须字段CATEGORY也得同时匹配上: 

SQL> MERGE INTO products p 
      2 USING newproducts np 
      3 ON (p.product_id = np.product_id) 
      4 WHEN MATCHED THEN 
      5 UPDATE 
      6 SET p.product_name = np.product_name 
      7 WHERE p.category = np.category; 

      2 rows merged. 

 

   SQL> SELECT * FROM products; 

      PRODUCT_ID PRODUCT_NAME CATEGORY 
      ---------- -------------------- ---------- 
      1501 VIVITAR 35MM ELECTRNCS 
      1502 OLYMPUS CAMERA ELECTRNCS 
      1600 PLAY GYM TOYS 
      1601 LAMAZE TOYS 
      1666 HARRY POTTER DVD 
      SQL> 
      SQL> rollback

 

   

在这个例子中, 产品ID为1502,1601和1666匹配ON条件但是1666的category不匹配. 因此MERGE命令只更新两行数据. 下面例子展示了在Updates和Inserts子句都使用WHERE子句: 

SQL> MERGE INTO products p 
      2 USING newproducts np 
      3 ON (p.product_id = np.product_id) 
      4 WHEN MATCHED THEN 
      5 UPDATE 
      6 SET p.product_name = np.product_name, 
      7 p.category = np.category 
      8 WHERE p.category = 'DVD' 
      9 WHEN NOT MATCHED THEN 
      10 INSERT 
      11 VALUES (np.product_id, np.product_name, np.category) 
      12 WHERE np.category != 'BOOKS' 
      SQL> / 

      1 row merged. 

 

SQL> SELECT * FROM products; 

      PRODUCT_ID PRODUCT_NAME CATEGORY 
      ---------- -------------------- ---------- 
      1501 VIVITAR 35MM ELECTRNCS 
      1502 OLYMPUS IS50 ELECTRNCS 
      1600 PLAY GYM TOYS 
      1601 LAMAZE TOYS 
      1666 HARRY POTTER TOYS 

      SQL> 

 

     

注意由于有WHERE子句INSERT没有插入所有不匹配ON条件的行到表PRODUCTS.
3、无条件的Inserts
你能够不用连接源表和目标表就把源表的数据插入到目标表中. 这对于你想插入所有行到目标表时是非常有用的. Oracle 10g现在支持在ON条件中使用常量过滤谓词. 举个常量过滤谓词例子ON (1=0). 下面例子从源表插入行到表PRODUCTS, 不检查这些行是否在表PRODUCTS中存在: 

SQL> MERGE INTO products p 
      2 USING newproducts np 
      3 ON (1=0) 
      4 WHEN NOT MATCHED THEN 
      5 INSERT 
      6 VALUES (np.product_id, np.product_name, np.category) 
        SQL> / 

      1 row merged. 

 

     

 SQL> SELECT * FROM products; 

      PRODUCT_ID PRODUCT_NAME CATEGORY 
      ---------- -------------------- ---------- 
      1501 VIVITAR 35MM ELECTRNCS 
      1502 OLYMPUS IS50 ELECTRNCS 
      1600 PLAY GYM TOYS 
      1601 LAMAZE TOYS 
      1666 HARRY POTTER DVD 
      1700 WAIT INTERFACE BOOKS 
      6 rows selected. 
      SQL> 

 

4、新增加的DELETE子句

Oracle 10g中的MERGE提供了在执行数据操作时清除行的选项. 你能够在WHEN MATCHED THEN UPDATE子句中包含DELETE子句. DELETE子句必须有一个WHERE条件来删除匹配某些条件的行.匹配DELETE WHERE条件但不匹配ON条件的行不会被从表中删除.
下面例子验证DELETE子句. 我们从表NEWPRODUCTS中合并行到表PRODUCTS中, 但删除category为ELECTRNCS的行. 

SQL> MERGE INTO products p 
      2 USING newproducts np 
      3 ON (p.product_id = np.product_id) 
      4 WHEN MATCHED THEN 
      5 UPDATE 
      6 SET p.product_name = np.product_name, 
      7 p.category = np.category 
      8 DELETE WHERE (p.category = 'ELECTRNCS') 
      9 WHEN NOT MATCHED THEN 
      10 INSERT 
      11 VALUES (np.product_id, np.product_name, np.category) 

 

    

  SQL> / 
      4 rows merged. 
      SQL> SELECT * FROM products; 
      PRODUCT_ID PRODUCT_NAME CATEGORY 
      ---------- -------------------- ---------- 
      1501 VIVITAR 35MM ELECTRNCS 
      1600 PLAY GYM TOYS 
      1601 LAMAZE TOYS 
      1666 HARRY POTTER TOYS 
      1700 WAIT INTERFACE BOOKS 
      SQL> 

 

产品ID为1502的行从表PRODUCTS中被删除, 因为它同时匹配ON条件和DELETE WHERE条件. 产品ID为1501的行匹配DELETE WHERE条件但不匹配ON条件, 所以它没有被删除. 产品ID为1700 的行不匹配ON条件, 所以被插入表PRODUCTS. 产品ID为1601和1666的行匹配ON条件但不匹配DELETE WHERE条件, 所以被更新为表NEWPRODUCTS中的值.

分享到:
评论

相关推荐

    oracle merge 用法详解

    oracle merge 用法详解

    Oracle merge into用法

    关于Oracle中merge into的用法,比较实用哦

    oracle merge into的使用

    oracle merge into的使用,开发必备的。

    Oracle中merge into的使用

    Oracle中merge into的使用 很有用的哦 学习一下

    浅谈Oracle数据库中Merge Into的用法.pdf

    浅谈Oracle数据库中Merge Into的用法.pdf

    Oracle MERGE INTO的用法示例介绍

    如果不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,同时性能也不好,要来回数据库两次.使用merge的话则可以一条SQL语句完成. 1)主要功能 ...

    oracle同一个表中使用merge.txt

    oracle同一个表中使用merge

    oracle中merge into用法及实例解析

    主要介绍了oracle中merge into用法及实例解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Oracle merge合并更新函数实例详解

    主要给大家介绍了关于Oracle merge合并更新函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    merge用法详解

    无论你在使用任何DBMS,你总是难以避免的将会遇到上面提到的这种需求,如果你不使用merge语句,你将会不得不在程序中增加大段的代码,或者是在oracle用很长的代码来实现。好在现在我们有了merge,可以帮我们省下很多...

    MySQL中实现插入或更新操作(类似Oracle的merge语句)

    可以使用以下语句: 更新一个字段: INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) ON DUPLICATE KEY UPDATE columnA=IF(columnB>0,1,columnA) 更新多个字段: INSERT INTO tbl (columnA,columnB,...

    SQL中Merge用法详解

    MERGE是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。通过MERGE语句,根据一张表(原数据表,source table)或子查询的连接条件对另外一张(目标表,target table)表进行查询,连接条件匹配上的进行UPDATE,...

    剑破冰山++Oracle开发艺术[1].part10

    本书主要覆盖Oracle开发必备的重要知识点:数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY、Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之...

    《剑破冰山__Oracle开发艺术_》高清PDF

    本书主要覆盖Oracle开发必备的重要知识点:数据库编程规范、Oracle开发常用工具及使用、MERGE方法、神秘的NULL和讨厌的CHAR、扩展GROUP BY Oracle自动类型转换、Oracle分析函数、Oracle层次查询、11g R2新特性之递归...

    Oracle SQL高级编程

    2.10 使用物化视图进行查询重写 44 2.11 确定执行计划 46 2.12 执行计划并取得数据行 50 2.13 SQL执行——总览 52 2.14 小结 53 第3章 访问和联结方法 55 第4章 SQL是关于集合的 95 第5章 关于问题 116 第6章 SQL...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。  JARED STILL 从1994年就开始使用...

Global site tag (gtag.js) - Google Analytics