1 引言 在程序设计的过程中,往往会遇到两个记录集的比较。如华东电网PMS接口中实现传递一天中变更(新增、修改、删除)的数据。实现的方式有多种,如编程存储过程返回游标,在存储过程中对两批数据进行比较等等。 本文主要讨论利用ORACLE的MINUS函数,直接实现两个记录集的比较。
2 实现步骤 假设两个记录集分别以表的方式存在,原始表为A,产生的比较表为B。 2.1 判断原始表和比较表的增量差异 利用MINUS函数,判断原始表与比较表的增量差异。 此增量数据包含两部分: 1)原始表A有、比较表B没有; 2)原始表A和比较表B都有,但是某些字段发生了改变。 ……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
1 引言
在程序设计的过程中,往往会遇到两个记录集的比较。如华东电网PMS接口中实现传递一天中变更(新增、修改、删除)的数据。实现的方式有多种,如编程存储过程返回游标,在存储过程中对两批数据进行比较等等。
本文主要讨论利用ORACLE的MINUS函数,直接实现两个记录集的比较。
2 实现步骤
假设两个记录集分别以表的方式存在,原始表为A,产生的比较表为B。
2.1 判断原始表和比较表的增量差异
利用MINUS函数,判断原始表与比较表的增量差异。
此增量数据包含两部分:
1)原始表A有、比较表B没有;
2)原始表A和比较表B都有,但是某些字段发生了改变。
2.2 判断比较表与原始表的增量差异
利用MINUS函数,判断比较表与原始表的增量差异。
此增量数据包含两部分:
1)比较表B有、原始表A没有;
2)比较表B和原始表A都有,但是某些字段发生了改变。
2.3 得出结果集
利用SQL语句中的对两种增量差异的处理,实现判别出比较表相对于原始表是进行了“插入”、“修改”、“删除”的情况。
3 实例演练
3.1创建表并插入数据
Create table A(A1 number(12),A2 varchar2(50)); Create table B(B1 number(12),B2 varchar2(50)); Insert Into A Values (1,'a'); Insert Into A Values (2,'ba'); Insert Into A Values (3,'ca'); Insert Into A Values (4,'da'); Insert Into B Values (1,'a'); Insert Into B Values (2,'bba'); Insert Into B Values (3,'ca'); Insert Into B Values (5,'dda'); Insert Into B Values (6,'Eda'); COMMIT; |
3.2进行增量差异数据比较
3.2.1原始表A与比较表B的增量差异
Select * from A minus select * from B; |
A1 A2 --------------------------------------------------------------- 2 ba 4 da |
3.2.2比较表B与原始表A的增量差异
Select * from B minus select * from A; |
结果如下:
B1 B2 --------------------------------------------------------------- 2 bba 5 dda 6 Eda |
3.2.3两种增量差异的合集
此合集包含3类数据:
--1、原始表A存在、比较表B不存在,属于删除类数据,出现次数1
--2、原始表A不存在、比较表B存在,属于新增类数据,出现次数1
--3、原始表A和比较表B都存在,属于修改类数据,出现次数2
Select A1,A2,1 t from (Select * from A minus select * from B) union Select B1,B2,2 t from (Select * from B minus select * from A); |
结果如下:
A1 A2 T ------------- -------------------------------------------------- ---------- 2 ba 1 2 bba 2 4 da 1 5 dda 2 6 Eda 2 |
3.3得到结果
Select A1,sum(t) from (Select A1,A2,1 t from (Select * from A minus select * from B) union Select B1,B2,2 t from (Select * from B minus select * from A)) Group by A1; |
结果如下:
A1 SUM(T) ----------------------- 6 2 2 3 4 1 5 2 |
结果中SUM(T)为1的为“删除”的数据,SUM(T)为2的为“新增”的数据,SUM(T)为3的为“修改”的数据。
4 分析
4.1 效率分析
序号 | 数据库配置 | Oracle版本 | 原表数据量 | 比较表数据量 | 字段列数 | 耗时 |
1 | Cpu:2.5GHz/内存:2048M | 9i | 928335 | 3608159 | 19 | 171.594s |
2 | Cpu:2.5GHz/内存:2048M | 9i | 928335 | 3608159 | 10 | 121.469s |
3 | Cpu:2.5GHz/内存:2048M | 9i | 928335 | 3608159 | 5 | 68.938s |
4 | Cpu:2.5GHz/内存:2048M | 9i | 49933 | 928335 | 19 | 33s |
5 | Cpu:2.5GHz/内存:2048M | 9i | 49933 | 928335 | 10 | 25.968s |
6 | Cpu:2.5GHz/内存:2048M | 9i | 49933 | 928335 | 5 | 11.484s |
7 | 16cpu:3.5GHz/内存:64G | 10g | 575283 | 575283 | 11 | 13.812s |
8 | 16cpu:3.5GHz/内存:64G | 10g | 109987 | 109987 | 40 | 2.17s |
4.2实现分析
在两个结果集比较的过程中,减少原始表和比较表比较的字段数目以及原始表和比较表的数据量都可以提高效率。
5 总结
此比较方法在执行效率上,可能不是非常好,但是能解决效率要求并不太高的问题。在实现上利用了Oracle的minus函数,此文在于引起大家对于Oracle函数的认识。
相关推荐
-
几个常用的Oracle函数及实例运用
Oracle数据库函数非常多,平时常用的只有那么几种,本文中作者根据实际项目情况,列举几个最常用的函数综合运用的例子。
-
T-SQL字符串函数:对字符串执行“SOUNDEX”分析
我们要讨论的最后一组字符串函数与“SOUNDEX”有关,它是一种可以把字符值转换成四个字符构成编码的系统,目的是确定类似发音的单词。
-
T-SQL字符串函数:获取字符串的相关信息
“CHARINDEX”函数的功能是从某字符串中指定的开始位置查找某字符串所在位置。该函数有三个参数:要搜索的字符串、待搜索范围字符串和搜索开始的位置。