利用Oracle的MINUS函数实现两个记录集的比较

日期: 2010-08-02 作者:Oracle DBA 来源:TechTarget中国 英文

1 引言   在程序设计的过程中,往往会遇到两个记录集的比较。如华东电网PMS接口中实现传递一天中变更(新增、修改、删除)的数据。实现的方式有多种,如编程存储过程返回游标,在存储过程中对两批数据进行比较等等。   本文主要讨论利用ORACLE的MINUS函数,直接实现两个记录集的比较。

  2 实现步骤   假设两个记录集分别以表的方式存在,原始表为A,产生的比较表为B。   2.1 判断原始表和比较表的增量差异   利用MINUS函数,判断原始表与比较表的增量差异。   此增量数据包含两部分:   1)原始表A有、比较表B没有;   2)原始表A和比较表B都有,但是某些字段发生了改变。   ……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

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函数的认识。

相关推荐