Oracle基础之Merge into
Merge into语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。
通过MERGE语句,根据一张表或多表联合查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。通过这个MERGE你能够在一个SQL语句中对一个表同时执行INSERT和UPDATE操作. 在 Oracle 10g中MERGE有一些新特性,后面我会介绍这些新特征。先看看MERGE语法如下:
MERGE INTO TEST_NEW DM USING
(
SELECT DATE_CD,
HR_CD,
DATE_HR,
DECODE(GROUPING(CITY_ID), 1, 9999, CITY_ID) AS CITY_ID,
DECODE(GROUPING(SYSTEM_ID), 1, -9999, SYSTEM_ID) AS SYSTEM_ID,
SUM(GSM_REG_USERCNT) AS GSM_REG_USERCNT,
SUM(TD_REG_USERCNT) AS TD_REG_USERCNT,
SUM(TD_REG_USERRAT) AS TD_REG_USERRAT,
SUM(GSM_POWERON_USERCNT) AS GSM_POWERON_USERCNT,
SUM(TD_POWERON_USERCNT) AS TD_POWERON_USERCNT,
SUM(TD_POWERON_USERRAT) AS TD_POWERON_USERRAT
FROM TEST_OLD
GROUP BY DATE_HR, DATE_CD, HR_CD, ROLLUP(SYSTEM_ID),ROLLUP(CITY_ID)
) TMP
ON
(
DM.DATE_CD = TMP.DATE_CD
AND DM.HR_CD = TMP.HR_CD
AND DM.CITY_ID = TMP.CITY_ID
AND DM.SYSTEM_ID = TMP.SYSTEM_ID
)
WHEN MATCHED THEN UPDATE SET
DM.GSM_REG_USERCNT = TMP.GSM_REG_USERCNT,
DM.TD_REG_USERCNT = TMP.TD_REG_USERCNT,
DM.TD_REG_USERRAT = TMP.TD_REG_USERRAT,
DM.GSM_POWERON_USERCNT = TMP.GSM_POWERON_USERCNT,
DM.TD_POWERON_USERCNT = TMP.TD_POWERON_USERCNT,
DM.TD_POWERON_USERRAT = TMP.TD_POWERON_USERRAT,
DM.DATE_HR = TMP.DATE_HR
WHEN NOT MATCHED THEN
INSERT
(
DM.DATE_CD,
DM.HR_CD,
DM.DATE_HR,
DM.CITY_ID,
DM.SYSTEM_ID,
DM.GSM_REG_USERCNT,
DM.TD_REG_USERCNT,
DM.TD_REG_USERRAT,
DM.GSM_POWERON_USERCNT,
DM.TD_POWERON_USERCNT,
DM.TD_POWERON_USERRAT
)
VALUES
(
TMP.DATE_CD,
TMP.HR_CD,
TMP.DATE_HR,
TMP.CITY_ID,
TMP.SYSTEM_ID,
TMP.GSM_REG_USERCNT,
TMP.TD_REG_USERCNT,
TMP.TD_REG_USERRAT,
TMP.GSM_POWERON_USERCNT,
TMP.TD_POWERON_USERCNT,
TMP.TD_POWERON_USERRAT
);
WHEN MATCHED THEN UPDATE SET 表示当on里面的关键字匹配上的时候,就进行修改操作。
但是值得注意的是,在做修改操作的时候,不可以修改on里面关键字的值。
WHEN NOT MATCHED THEN INSERT 表示当on里面的关键字匹配不上的时候,也就是说没有这样一条记录存在TEST_NEW表中时,就进行新增操作。
这时,做新增操作,就可以将on里面的字段进行设置值。
在ORACLE 10i中,MERGE有如下一些新特性。
MERGE INTO ORDER_HISTORY H USING
(
SELECT ORDER_ID ,--订单编号
CUSTOMER_ID ,--客户编号
EMPLOYEE_ID ,--员工编号
ORDER_DATE ,--订购日期;
REQUIRED_DATE ,--预计到达日期
SHIPPED_DATE ,--发货日期
SHIPPER ,--运货商
FREIGHT ,--运费
SHIP_NAM ,--货主姓名;
SHIP_ADDRESS ,--货主地址
SHIP_CITY ,--货主所在城市;
SHIP_REGION ,--货主所在地区;
SHIP_POSTALCODE ,--货主邮编
SHIP_COUNTRY --货主所在国家
FROM ORDER_DTL
WHERE TO_CHAR(ODER_DATE, 'YYYY-MM-DD') = '20110530'
) O
ON
(
O.ORDER_ID = H.ORDER_ID
)
WHEN NOT MATCHED THEN INSERT
(
H.ORDER_ID ,
H.CUSTOMER_ID ,
H.EMPLOYEE_ID ,
H.ORDER_DATE ,
H.REQUIRED_DATE ,
H.SHIPPED_DATE ,
H.SHIPPER ,
H.FREIGHT ,
H.SHIP_NAM ,
H.SHIP_ADDRESS ,
H.SHIP_CITY ,
H.SHIP_REGION ,
H.SHIP_POSTALCODE ,
H.SHIP_COUNTRY
)
VALUES
(
O.ORDER_ID ,
O.CUSTOMER_ID ,
O.EMPLOYEE_ID ,
O.ORDER_DATE ,
O.REQUIRED_DATE ,
O.SHIPPED_DATE ,
O.SHIPPER ,
O.FREIGHT ,
O.SHIP_NAM ,
O.SHIP_ADDRESS ,
O.SHIP_CITY ,
O.SHIP_REGION ,
O.SHIP_POSTALCODE ,
O.SHIP_COUNTRY
);
从上可以看出,MATCHED 或NOT MATCHED是可选的。不必非得
现在由于需求改变,我们仅仅需要把员工1001的订单数据同步到订单历史记录表
MERGE INTO ORDER_HISTORY H USING
(
SELECT ORDER_ID ,--订单编号
CUSTOMER_ID ,--客户编号
EMPLOYEE_ID ,--员工编号
ORDER_DATE ,--订购日期;
REQUIRED_DATE ,--预计到达日期
SHIPPED_DATE ,--发货日期
SHIPPER ,--运货商
FREIGHT ,--运费
SHIP_NAM ,--货主姓名;
SHIP_ADDRESS ,--货主地址
SHIP_CITY ,--货主所在城市;
SHIP_REGION ,--货主所在地区;
SHIP_POSTALCODE ,--货主邮编
SHIP_COUNTRY --货主所在国家
FROM ORDER_DTL
) O
ON
(
O.ORDER_ID = H.ORDER_ID
)
WHEN MATCHED THEN UPDATE SET
H.CUSTOMER_ID = O.CUSTOMER_ID ,
H.EMPLOYEE_ID = O.EMPLOYEE_ID ,
H.ORDER_DATE = O.ORDER_DATE ,
H.REQUIRED_DATE = O.REQUIRED_DATE ,
H.SHIPPED_DATE = O.SHIPPED_DATE ,
H.SHIPPER = O.SHIPPER ,
H.FREIGHT = O.FREIGHT ,
H.SHIP_NAM = O.SHIP_NAM ,
H.SHIP_ADDRESS = O.SHIP_ADDRESS ,
H.SHIP_CITY = O.SHIP_CITY ,
H.SHIP_REGION = O.SHIP_REGION ,
H.SHIP_POSTALCODE = O.SHIP_POSTALCODE ,
H.SHIP_COUNTRY = O.SHIP_COUNTRY
WHERE O.EMPLOYEE_ID = '1001'
WHEN NOT MATCHED THEN INSERT
(
H.ORDER_ID ,
H.CUSTOMER_ID ,
H.EMPLOYEE_ID ,
H.ORDER_DATE ,
H.REQUIRED_DATE ,
H.SHIPPED_DATE ,
H.SHIPPER ,
H.FREIGHT ,
H.SHIP_NAM ,
H.SHIP_ADDRESS ,
H.SHIP_CITY ,
H.SHIP_REGION ,
H.SHIP_POSTALCODE ,
H.SHIP_COUNTRY
)
VALUES
(
O.ORDER_ID ,
O.CUSTOMER_ID ,
O.EMPLOYEE_ID ,
O.ORDER_DATE ,
O.REQUIRED_DATE ,
O.SHIPPED_DATE ,
O.SHIPPER ,
O.FREIGHT ,
O.SHIP_NAM ,
O.SHIP_ADDRESS ,
O.SHIP_CITY ,
O.SHIP_REGION ,
O.SHIP_POSTALCODE ,
O.SHIP_COUNTRY
) WHERE O.EMPLOYEE_ID = '1001';
Oracle基础之Merge into的更多相关文章
- Oracle基础 表分区
Oracle基础 表分区 一.表分区 (一)表分区的分类 1.范围分区(range) 2.散列分区(hash) 3.列表分区(list) 4.复合分区:范围-哈希(range-hash).范围-列表( ...
- oracle基础教程(8)oracle修改字符集
oracle基础教程(8)oracle修改字符集 1.用dba连接数据库 -->sqlplus / as sysdba 2.查看字符集 -->SELECT parameter, value ...
- 图说Oracle基础知识(一)
本文主要对Oralce数据库操作的基础知识进行一下梳理,以便进行归纳总结.适用于未使用过Oracle数据库的读者,或需要学习Oracle数据库方面的基础知识.如有不足之处,还请指正. 关于SQL介绍的 ...
- oracle基础教程oracle客户端详解
oracle基础教程oracle客户端工具详解 参考网址:http://www.oraclejsq.com/article/010100114.html 该教程介绍了oracle自带客户端sqlplu ...
- Oracle基础了解
数据库: 关系型数据库 select * from 表名 非关系型数据库(做不到复杂查询) 以对象的形式进行存储 {"aaa":"ccc"}---键值对 ora ...
- Oracle基础篇--00引言
今天开始,复习oracle基础.主要是以前培训的时候的文档作为结构来梳理知识点,主要目的是把Oracle基础打的扎实点.后面要转做后台开发,或者工作中需要用到数据库知识时也不至于临时抱佛脚. 一直以来 ...
- Oracle基础学习笔记
Oracle基础学习笔记 最近找到一份实习工作,有点头疼的是,有阶段性考核,这...,实际想想看,大学期间只学过数据库原理,并没有针对某一数据库管理系统而系统的学习,这正好是一个机会,于是乎用了三天时 ...
- Oracle基础数据类型与运算符
Oracle基础数据类型: 1. 字符型:字符串 char(最大2000), nchar(最大1000, 支持 Unicode)--->固定长 ...
- ORACLE| ORACLE基础语法汇总
创 ORACLE| ORACLE基础语法汇总 2018-07-18 16:47:34 YvesHe 阅读数 9141更多 分类专栏: [数据库] 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
随机推荐
- 简易APB4 slave实践
一个简易的(不完整的)APB4 slave的可以没有PREADY和PSLVERR,这两个信号都被赋予常数,以及没有PPROT. 两种不同类型的寄存器: 图: 普通寄存器电路图 图: 带读写控制寄存器电 ...
- python自动化 协程函数、二分查找、模块搜索
协程函数 yiled: 把函数的执行结果封装好__iter__和__next__得到一个迭代器 与return功能类似,都可以返回值,但是return只能返回一次只 def fun(count): p ...
- thinkPhP + Apache + PHPstorm整合框架
最近在学习使用 ThinkPhP,网上很多都是用一些整合好的服务框架,为了学习,在这里我简单的对Apache.PHP做一个原生的整合,希望对你有帮助. 步骤: ①下载 thinkPHP.PHP.Apa ...
- 服务端模拟http服务请求客户端
try { InputStream in = req.getInputStream(); int i = -1; ByteArrayOutputStream out = new ByteArrayOu ...
- Java基础29-子父类中的成员变量
/* 成员: 1.成员变量 2.函数 3.构造函数 变量: this 代表当前对象的引用 this.变量 首先在本类中找所需要的变量,如果没有找到再父类中找. super 用于访问当前对象的父类成员, ...
- 开源移动端IM比较SipDroid,IMSDroid,CSipsimple,Linphone,webrtc
最新要做一个移动端视频通话软件,大致看了下现有的开源软件 一) sipdroid1)架构sip协议栈使用JAVA实现,音频Codec使用skype的silk(Silk编解码是Skype向第三方开发人员 ...
- EntityFramework6 版本更变产生的错误
LINQ to Entities does not recognize the method 'System.Nullable`1[System.Int32] DiffMinutes(System.N ...
- Unity游戏接入Steam成就
在接入Steam成就,其实有些地方是有坑点的,而且steam官网给的是c++代码的接入教程.如果是老鸟的话,接入还并不是很难. 但是对于新手其实还是比较痛苦的,网上这方面的资料很少.这里我给总结下,u ...
- C#中要使ListBox使用AddRange()时,能够触发SelectedValueChanged事件
1. 要触发 SelectedValueChanged事件,必须要当ListBox所选中的值发生改变 基本思路是: 当AddRange()后,就马上指定ListBox的SelectedIndex,这样 ...
- input输入时软键盘回车显示搜索
很多时候我们会看到输入法里面回车是搜索等字眼,今天我们就来实现这个效果 原本的效果: <form action=""> <input type="sea ...