zoukankan      html  css  js  c++  java
  • oracle 两表数据对比---minus

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

  • 相关阅读:
    string.format()详解
    微信支持的Authorization code授权模式(公众号开发)(开放平台资料中心中的代公众号发起网页授权)
    HttpClient类详解
    PostgreSQL按年月日分组(关键词:extract time as Year/Month/Day)
    sql中的(case when then else end )的用法(相当于java中的if else)
    模板题 Problem I Link Cut Tree
    BZOJ2555 SubString
    poj3264(简单线段树)
    poj1011(DFS+剪枝)
    poj1042(贪心+枚举)
  • 原文地址:https://www.cnblogs.com/ios9/p/13202743.html
Copyright © 2011-2022 走看看