`
有翅膀的鱼
  • 浏览: 5686 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Merge使用方法

阅读更多
oracle merge使用方法

oracle merge语法


merge into biz_module_apccode o
using (select * from temp_fa) n
on (o.biz_module_id=142 and o.apccode_id=n.apccode_id)
when matched then
update set o.order_by=n.order_by



/////////////////////////////////////////////////////
Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle 10g中MERGE有如下一些改进:

1、UPDATE或INSERT子句是可选的

2、UPDATE和INSERT子句可以加WHERE子句

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

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

首先创建示例表:
[pre]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;[/pre]
1、可省略的UPDATE或INSERT子句

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


[pre]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>[/pre]



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

[pre]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[/pre]
2、带条件的Updates和Inserts子句

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

[pre]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;[/pre]



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

[pre]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>[/pre]


注意由于有WHERE子句INSERT没有插入所有不匹配ON条件的行到表PRODUCTS.
3、无条件的Inserts

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








[pre]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)
  7 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 DVD
  1700 WAIT INTERFACE BOOKS
  6 rows selected.
  SQL>[/pre]



4、新增加的DELETE子句

Oracle 10g中的MERGE提供了在执行数据操作时清除行的选项.你能够在WHEN MATCHED THEN UPDATE子句中包含DELETE子句.DELETE子句必须有一个WHERE条件来删除匹配某些条件的行.匹配DELETE WHERE条件但不匹配ON条件的行不会被从表中删除.

下面例子验证DELETE子句. 我们从表NEWPRODUCTS中合并行到表PRODUCTS中, 但删除category为ELECTRNCS的行.

[pre]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>[/pre]



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

自己的例子:
MERGE INTO TBL_REALTIME_AD_USER_RPT RAUP
    USING (SELECT T1.USER_ID,
                  T2.MANAGER_ID,
                  T1.ROTATE_AD_ID,
                  TO_CHAR(T1.VISIT_DATE, 'YYYYMMDD') REPORT_DATE,
                  COUNT(*) CV,
                  COUNT(DISTINCT COOKIE_ID) UV
             FROM TBL_REALTIME_CLICK_LOG T1, TBL_USER T2
            WHERE T1.USER_ID = T2.ID
              AND TO_CHAR(T1.VISIT_DATE, 'YYYYMMDD') = V_REPORT_DATE
            GROUP BY T1.USER_ID,
                     T2.MANAGER_ID,
                     T1.ROTATE_AD_ID,
                     TO_CHAR(T1.VISIT_DATE, 'YYYYMMDD')) S
    ON (RAUP.USER_ID = S.USER_ID AND RAUP.AD_ID = S.ROTATE_AD_ID AND RAUP.REPORT_DATE = S.REPORT_DATE)
    WHEN MATCHED THEN
      UPDATE SET RAUP.CLICK = S.CV, RAUP.UV = S.UV
    WHEN NOT MATCHED THEN
      INSERT
        (ID, USER_ID, MANAGER_ID, AD_ID, REPORT_DATE, CLICK, UV)
      VALUES
        (SEQ_REALTIME_AD_USER_RPT_ID.NEXTVAL,
         S.USER_ID,
         S.MANAGER_ID,
         S.ROTATE_AD_ID,
         S.REPORT_DATE,
         S.CV,
         S.UV);
分享到:
评论

相关推荐

    Hibernate中的merge使用详情解说

    例如,如果我们在使用 merge 方法前没有设置对象的 ID,那么 merge 方法将抛出异常。 在使用 merge 方法时,我们还需要注意 Session 的生命周期。在上面的示例代码中,我们可以看到,在第一个 Session 中,我们使用...

    android merge 标签使用介绍

    本篇文章将详细介绍`merge`标签的使用方法及其优势。 `merge`标签最初被引入是为了减少视图层次,这是因为在Android系统中,每个视图层级都会带来额外的绘制开销。当我们在一个布局文件中嵌套多个视图时,这些层级...

    Hibernate merge、update与saveOrUpdate方法的区别

    - 使用`merge`方法,Hibernate首先会查询数据库中是否存在相同的ID,如果存在则更新该记录;如果不存在,则插入一条新记录。 - 使用`update`方法,Hibernate会直接更新对应ID的记录,假设ID存在的情况下。 - 使用...

    Mybatis批量foreach merge into的用法

    Mybatis批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不存在则插入。下面是该方法的详细介绍: ...

    merge的注意事项

    2. **事务安全性**:使用`merge()`时,可以在事务外部修改对象的状态,然后在事务内部调用`merge()`方法,将这些更改安全地应用到数据库中。这样可以避免在事务开始前就加载对象,从而减少了内存占用。 3. **区别于...

    Hibernate中的merge使用详情解说.docx

    综上所述,`merge()`方法是Hibernate中处理对象状态转换和数据同步的重要工具。它能够处理各种对象状态,确保数据的一致性和完整性,同时避免了可能的冲突。在设计和实现业务逻辑时,理解并正确使用`merge()`对于...

    Include和merge标签使用

    让我们深入探讨这两种标签的使用方法及其优化布局的作用。 首先,`<include>`标签允许我们将一个布局文件插入到另一个布局文件中,这样可以实现布局组件的重用。例如,假设我们有一个通用的头部布局(header.xml)...

    merge用法详解(实例详解)

    【知识点详解】 ...通过以上介绍,我们了解了`MERGE INTO`语句的基本概念和使用方法,以及在实际场景中如何进行数据同步。在数据库管理和ETL过程中,合理运用`MERGE`能有效地提高数据处理的效率和准确性。

    WinMerge(文件比较)

    下面我们将深入探讨WinMerge的核心功能、特性以及使用方法。 ### 1. **核心功能** - **文件对比**:WinMerge能够对比两个文本文件或目录的差异,无论是单个文件还是整个文件夹,都能清晰地展示出它们的异同之处。 ...

    Android中include和merge标签的使用

    本篇文章将深入探讨这两个标签的使用方法以及它们在Android开发中的作用。 ### `include`标签 `include`标签允许你在不同的布局文件中包含一个公共的布局,这样可以减少代码重复,提高代码复用性。基本语法如下: ...

    winmerge文件比较工具

    本文将深入探讨WinMerge的功能、使用方法及其在实际工作中的应用。 WinMerge是一款开源的文件和文件夹比较软件,适用于Windows操作系统。它以其直观的用户界面和强大的对比功能,使得文件比较变得简单易行。通过对...

    (winmerge for linux)grimmdp-winmerge-1bd708f4cf72.zip

    安装方法: WinMerge 3 ========== WinMerge 3 is a port of WinMerge (http://winmerge.org) to use cross-platform with Qt (http://qt.nokia.com/) framework. This project is still in very early stages. ...

    oracle同一个表中使用merge.txt

    oracle同一个表中使用merge

    android中include和merge标记的区别和使用

    接下来,我们将深入探讨这两个标记的区别和使用方法。 ### `include`标签 `include`标签用于将一个布局文件嵌入到另一个布局文件中,它允许开发者复用已有的布局组件。使用`include`标签可以将常见的UI元素如头部...

    MergeList_Sq.zip_MergeList Sq_MergeList_Sq

    在“MergeList_Sq.cpp”文件中,可能会实现以上的一种或两种方法,具体取决于代码的设计。通常,为了提高效率,我们会在合并过程中尽量减少元素之间的比较次数,因为这是主要的时间消耗点。对于大线性表,这种优化...

    前端开源库-jsonmerge

    通过阅读 `README.md` 和测试用例,可以更深入地了解 `jsonmerge` 的使用方法和注意事项。 ### 5. 应用场景与最佳实践 - **配置管理**:在多环境配置中,可以使用 `jsonmerge` 将开发、测试和生产环境的配置文件...

    WinMerge2.10 多语言版

    本文将详细介绍WinMerge2.10多语言版的特点、用途以及使用方法,帮助读者深入理解其在日常开发工作中的重要性。 一、WinMerge2.10的特点 1. **多语言支持**:WinMerge2.10提供多语言界面,其中包括简体中文,使得...

    two-phase-merge_sort-.rar_2phase merge sort_merge_sort_two merge

    2. **磁盘访问优化方法**:为了提高数据访问性能,通常会采用各种优化策略,如预读取(预测并加载未来可能需要的数据)、缓冲技术(使用内存作为临时存储以减少磁盘访问)、磁盘调度算法(如最短寻道时间优先SSTF、...

    Oracle_merge

    本文将详细介绍 Oracle 中 `MERGE` 关键字的使用方法,并结合实际示例来解析其工作原理。 #### 二、`MERGE` 语句的基本概念 在 Oracle 9i R2 版本之前,如果需要同时进行更新和插入操作,开发人员通常需要编写两条...

Global site tag (gtag.js) - Google Analytics