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);
分享到:
相关推荐
例如,如果我们在使用 merge 方法前没有设置对象的 ID,那么 merge 方法将抛出异常。 在使用 merge 方法时,我们还需要注意 Session 的生命周期。在上面的示例代码中,我们可以看到,在第一个 Session 中,我们使用...
本篇文章将详细介绍`merge`标签的使用方法及其优势。 `merge`标签最初被引入是为了减少视图层次,这是因为在Android系统中,每个视图层级都会带来额外的绘制开销。当我们在一个布局文件中嵌套多个视图时,这些层级...
- 使用`merge`方法,Hibernate首先会查询数据库中是否存在相同的ID,如果存在则更新该记录;如果不存在,则插入一条新记录。 - 使用`update`方法,Hibernate会直接更新对应ID的记录,假设ID存在的情况下。 - 使用...
Mybatis批量foreach merge into的用法是通过Mybatis的动态SQL语法foreach循环插入实现的,这种方法可以批量插入时间价格表数据。如果某个套餐的某天的价格存在,则更新,不存在则插入。下面是该方法的详细介绍: ...
2. **事务安全性**:使用`merge()`时,可以在事务外部修改对象的状态,然后在事务内部调用`merge()`方法,将这些更改安全地应用到数据库中。这样可以避免在事务开始前就加载对象,从而减少了内存占用。 3. **区别于...
综上所述,`merge()`方法是Hibernate中处理对象状态转换和数据同步的重要工具。它能够处理各种对象状态,确保数据的一致性和完整性,同时避免了可能的冲突。在设计和实现业务逻辑时,理解并正确使用`merge()`对于...
让我们深入探讨这两种标签的使用方法及其优化布局的作用。 首先,`<include>`标签允许我们将一个布局文件插入到另一个布局文件中,这样可以实现布局组件的重用。例如,假设我们有一个通用的头部布局(header.xml)...
【知识点详解】 ...通过以上介绍,我们了解了`MERGE INTO`语句的基本概念和使用方法,以及在实际场景中如何进行数据同步。在数据库管理和ETL过程中,合理运用`MERGE`能有效地提高数据处理的效率和准确性。
下面我们将深入探讨WinMerge的核心功能、特性以及使用方法。 ### 1. **核心功能** - **文件对比**:WinMerge能够对比两个文本文件或目录的差异,无论是单个文件还是整个文件夹,都能清晰地展示出它们的异同之处。 ...
本篇文章将深入探讨这两个标签的使用方法以及它们在Android开发中的作用。 ### `include`标签 `include`标签允许你在不同的布局文件中包含一个公共的布局,这样可以减少代码重复,提高代码复用性。基本语法如下: ...
本文将深入探讨WinMerge的功能、使用方法及其在实际工作中的应用。 WinMerge是一款开源的文件和文件夹比较软件,适用于Windows操作系统。它以其直观的用户界面和强大的对比功能,使得文件比较变得简单易行。通过对...
安装方法: 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
接下来,我们将深入探讨这两个标记的区别和使用方法。 ### `include`标签 `include`标签用于将一个布局文件嵌入到另一个布局文件中,它允许开发者复用已有的布局组件。使用`include`标签可以将常见的UI元素如头部...
在“MergeList_Sq.cpp”文件中,可能会实现以上的一种或两种方法,具体取决于代码的设计。通常,为了提高效率,我们会在合并过程中尽量减少元素之间的比较次数,因为这是主要的时间消耗点。对于大线性表,这种优化...
通过阅读 `README.md` 和测试用例,可以更深入地了解 `jsonmerge` 的使用方法和注意事项。 ### 5. 应用场景与最佳实践 - **配置管理**:在多环境配置中,可以使用 `jsonmerge` 将开发、测试和生产环境的配置文件...
本文将详细介绍WinMerge2.10多语言版的特点、用途以及使用方法,帮助读者深入理解其在日常开发工作中的重要性。 一、WinMerge2.10的特点 1. **多语言支持**:WinMerge2.10提供多语言界面,其中包括简体中文,使得...
2. **磁盘访问优化方法**:为了提高数据访问性能,通常会采用各种优化策略,如预读取(预测并加载未来可能需要的数据)、缓冲技术(使用内存作为临时存储以减少磁盘访问)、磁盘调度算法(如最短寻道时间优先SSTF、...
本文将详细介绍 Oracle 中 `MERGE` 关键字的使用方法,并结合实际示例来解析其工作原理。 #### 二、`MERGE` 语句的基本概念 在 Oracle 9i R2 版本之前,如果需要同时进行更新和插入操作,开发人员通常需要编写两条...