`
immortal2512
  • 浏览: 44956 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

oracle 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);

分享到:
评论

相关推荐

    oracle merge into的使用

    标题:Oracle Merge Into 的使用 描述详解:Oracle Merge Into 是一个功能强大的SQL语句,它在Oracle数据库系统中被广泛用于处理数据同步、更新或插入操作。与传统的UPDATE和INSERT语句相比,Merge Into 提供了更为...

    oracle merge 用法详解

    ### Oracle Merge 用法详解 #### 一、Oracle Merge 命令介绍 自Oracle 9i版本开始,Oracle数据库引入了一个非常强大的SQL语句——`MERGE`命令。通过这个命令,用户可以在一个单一的SQL语句中完成对表的插入(`...

    Oracle merge into用法

    在Oracle数据库中,`MERGE INTO`语句是一种非常强大的工具,它允许用户根据源表中的数据更新目标表,同时也可以插入新记录。这一特性在处理大量数据时尤其有用,因为它能够在一个步骤中完成更新和插入操作,从而提高...

    Oracle中merge into的使用

    在Oracle数据库中,`MERGE INTO`语句是一种强大的数据操作工具,它允许你在一个步骤中执行更新(UPDATE)和插入(INSERT)操作,从而提高了数据处理的效率和灵活性。这个命令尤其适用于需要同步两个表的数据时,比如...

    oracle Merge 函数.doc

    "Oracle Merge 函数详解" Oracle Merge 函数是一种强大的数据操作语句,用于从一个表中选择一些数据更新或者插入到另一个表中。Merge 函数的使用方式有三种:只更新不插入、只插入不更新和既插入也更新。 Merge ...

    oracle死锁原因解决办法

    #### 四、解决Oracle死锁的方法 ##### 4.1 优化SQL语句 确保所有事务中的SQL语句按照相同的顺序执行可以减少死锁的机会。此外,还可以通过合并多个SQL语句或者调整SQL语句的执行顺序来避免死锁。 ##### 4.2 调整...

    Oracle_merge

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

    oracle同一个表中使用merge.txt

    oracle同一个表中使用merge

    oracle使用 merge 更新或插入数据(总结)

    oracle使用 merge 更新或插入数据(总结)

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

    Oracle 数据库中 Merge Into 的用法 在 Oracle 数据库中,Merge Into 语句是一种非常有用的功能,它主要用来合并 update 和 insert 语句,即用一个表中的数据来修 改或插入到另一个表中。Merge Into 语句的主要原则...

    oracle merge

    merge 详解 及实例 优点:  — 避免了分开更新  — 提高性能并易于使用  — 在数据仓库应用中十分有用  — 使用merge比传统的先判断再选择插入或更新快很多

    Oracle MERGE INTO的用法示例介绍

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

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

    在提供的示例中,我们看到如何使用MERGE语句来更新或插入数据到`t_config_related`表。假设我们要根据某个序列号(seq)来更新或插入数据: ```sql MERGE INTO t_config_related A1 USING (select '97547758-6f85-...

    oracle使用 merge

    3. **处理`DBLINK`问题**:在跨数据库链接使用`MERGE`时,需要注意Oracle 10g中一个已知的bug(Bug ID 4311273),该bug可能导致ORA-02064错误。解决方法是确保`WHEN MATCHED THEN`和`WHEN NOT MATCHED THEN`两个...

    使用BULK COLLECT, MERGE 语句提高sql执行效率

    详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询

    Mybatis批量foreach merge into的用法

    首先,需要使用Oracle 9i及其以后版本支持的merge into语句,该语句可以实现insertOrUpdate的功能。然后,使用Mybatis的动态SQL语法foreach循环插入,待插入的实体bean的List通过查询数据库dual形成表。foreach的 ...

    oracle-merge

    关于数据库oracle merge RGE INTO newmergetest m using ...

    oracle数据匹配merge into的实例详解

    Oracle的`MERGE INTO`语句是一种强大的工具,用于根据源数据更新或插入目标表的记录。这个SQL命令结合了`INSERT`, `UPDATE`和`DELETE`操作,使得在处理数据匹配和同步时更加高效。在给定的实例中,`MERGE INTO`被...

Global site tag (gtag.js) - Google Analytics