博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle merge into 用法详解
阅读量:5898 次
发布时间:2019-06-19

本文共 2805 字,大约阅读时间需要 9 分钟。

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操作。

首先创建示例表:

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

update使用,省略insert:

MERGE INTO products p

   USING newproducts np
   ON (p.product_id = np.product_id)
   WHEN MATCHED THEN
   UPDATE
   SET p.product_name = np.product_name,
   p.category = np.category;

insert使用,省略update:MERGE INTO products p

    USING newproducts np
    ON (p.product_id = np.product_id)
    WHEN NOT MATCHED THEN
    INSERT
    VALUES (np.product_id, np.product_name,np.category);

2、带条件的Updates和Inserts子句

你能够添加WHERE子句到UPDATE或INSERT子句中去, 来跳过update或insert操作对某些行的处理.

下面例子根据表NEWPRODUCTS来更新表PRODUCTS数据,根据条件category进行更新

MERGE INTO products p

  USING newproducts np
  ON (p.product_id = np.product_id)
   WHEN MATCHED THEN
   UPDATE
   SET p.product_name = np.product_name
  WHERE p.category = np.category;

 

MERGE INTO products p

 USING newproducts np
 ON (p.product_id = np.product_id)
 WHEN MATCHED THEN
 UPDATE
 SET p.product_name = np.product_name,
 p.category = np.category
WHERE p.category = 'DVD'
WHEN NOT MATCHED THEN
INSERT
VALUES (np.product_id, np.product_name, np.category)
WHERE np.category != 'BOOKS'

 

3.两表连接无条件的Inserts

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

 

SQL> MERGE INTO products p

    USING newproducts np
   ON (1=0)
   WHEN NOT MATCHED THEN
   INSERT
   VALUES (np.product_id, np.product_name, np.category)
   WHERE np.category = 'BOOKS'

 

转载于:https://www.cnblogs.com/kkfish/p/5264516.html

你可能感兴趣的文章
ASP.NET Web API自身对CORS的支持: EnableCorsAttribute特性背后的故事
查看>>
UNIX网络编程读书笔记:TCP输出、UDP输出和SCTP输出
查看>>
扩展 DbUtility (1)
查看>>
iOS开发UI篇—使用picker View控件完成一个简单的选餐应用
查看>>
Apple Developer Registration and DUNS Number Not Accepted
查看>>
Hadoop学习笔记系列文章导航
查看>>
Win7 64位 php-5.5.13+Apache 2.4.9+mysql-5.6.19 配置
查看>>
不同页面之间实现参数传递的几种方式讨论
查看>>
程序员进阶之路—如何独当一面
查看>>
SpringMVC中ModelAndView addObject()设置的值jsp取不到的问题
查看>>
Prometheus : 入门
查看>>
使用 PowerShell 创建和修改 ExpressRoute 线路
查看>>
PHP如何学习?
查看>>
谈教育与成长
查看>>
jni c++
查看>>
在C#中获取如PHP函数time()一样的时间戳
查看>>
Redis List数据类型
查看>>
大数据项目实践(四)——之Hive配置
查看>>
初学vue2.0-组件-文档理解笔记v1.0
查看>>
NG-ZORRO-MOBILE 0.11.9 发布,基于 Angular 7 的 UI 组件
查看>>