数据库服务器:Oracle
现在有两个结果集:

A1:

Cause       Rate 
UEG            2000
GYU            1900
NBU            2900
CET            3000


A2:
Cause       Rate 
UEG            2000
GYU            1900
NBU            2900
CET            3000

有没有什么比较好的方法实现 判断两个结果集的行数和每行字段的值都是一样的。

 

1.通用解决方案



 


[sql]  view plain  copy



    1. select Cause, Rate  
    2. from (  
    3. select Cause, Rate from A1  
    4. union all  
    5. select Cause, Rate from A2)  
    6. group by Cause, Rate   
    7. having count(*) < 2  
    8.



    如果结果集为NULL,就可以判断该结果集是一致的

     

    2. oracle 解决方案


    [sql]  view plain  copy


    1. (select * from a1  
    2.  minus   
    3. select * from a2   
    4. )  
    5. union all  
    6. select * from a2  
    7.  minus   
    8. select * from a1   
    9. )


     

     

    3.oracle存储过程解决方案

    现在需要完成一个sql,比较两个表数据完全一致(两个表结构肯定是一致的).
    我现在是通过minus功能来完成
    如果 两个表 minus的结果等于0,那么证明这两个表完全一致
    当然之前肯定还做一个两个表行数的比较,首先要保证两个表行数一致的,
    感觉这样写出来的东东代码是比较少,但是不知效率如何  
    下面是整个存储过程,已经调试通过了 


    正确的做法是: 1、先判断两个表行数是否相同,如果相同的继续往下走。 2、用源表 minus 目标表,看返回的行数是否为0,如果为0则继续往下走。 3、用目标表 minus 源表,看返回的行数是否为零,如果为零则证明两个表相同。


     


    [sql]  view plain  copy



    1. create or replace procedure compareTableData(srcTable in  
    2. varchar2 , destTable in varchar2 , oi_return out int)  
    3. is  
    4. --源表格  
    5.  src_table  varchar2(32);  
    6. --目标表格  
    7.  dest_Table  varchar2(32);  
    8. --源表格行数  
    9. int;  
    10. --目标表格函数  
    11. int;  
    12. --两个表格数据(即结果集)之间的差集的个数  
    13. int;  
    14.    
    15.  selectSrcSql varchar2(100);  
    16.  selectDestSql varchar2(100);  
    17.  selectSrcMinusDestSql varchar2(200);  
    18.  selectDestMinusSrcSql varchar2(200);  
    19. --错误描述  
    20.  v_err_desc varchar2(100);  
    21. begin  
    22.       oi_return   :=0;  
    23.       dbms_output.put_line(oi_return);  
    24.         
    25.       src_table := srcTable;  
    26.       
    27.       dest_Table := destTable;  
    28.   
    29.   
    30. --构建查询源表行数的动态sql  
    31. ' select count(*)  from '||src_table;  
    32.   
    33.        DBMS_OUTPUT.PUT_LINE(selectSrcSql);  
    34.   
    35. --执行查询源表行数的动态sql  
    36. execute immediate selectSrcSql Into src_table_count;  
    37.   
    38. --构建查询源目标行数的动态sql  
    39. ' select count(*)   from ' ||dest_Table;  
    40.   
    41.       DBMS_OUTPUT.PUT_LINE(selectDestSql);  
    42.   
    43. --执行查询源目标行数的动态sql  
    44. execute immediate selectDestSql Into dest_table_count;  
    45.   
    46. --构建查询源表和目标表差集行数的动态sql  
    47. select count(*)   from (  
    48. select * from ' ||src_table||  
    49.          ' minus  
    50. select * from ' ||dest_table||  ')';  
    51.   
    52.          DBMS_OUTPUT.PUT_LINE(selectSrcMinusDestSql);  
    53.            
    54.            
    55. --构建查询目标表和源表差集行数的动态sql  
    56. select count(*)   from (  
    57. select * from ' ||dest_table||  
    58.          ' minus  
    59. select * from ' ||src_table||  ')';  
    60.   
    61.          DBMS_OUTPUT.PUT_LINE(selectDestMinusSrcSql);    
    62.   
    63. --如果表格行数不一致,那么证明两个表结果集肯定不一致  
    64.       if(src_table_count!=dest_table_count)  
    65. then  
    66.           oi_return:= src_table_count-dest_table_count;  
    67. else  
    68. --执行查询源表和目标表差集行数的动态sql  
    69. execute immediate selectSrcMinusDestSql into minus_count;  
    70. --如果差集为0,表明源表集合中元素在目标表中都存在,但是并不能说明源表和目标表集合完全一致,  
    71. --因为源表中可能有重复元素,导致差集也为0的结果  
    72.           if(minus_count=0)  
    73. then  
    74. --执行查询目标表和源表差集行数的动态sql  
    75. execute immediate selectDestMinusSrcSql into minus_count;  
    76. end if;  
    77. --返回差集个数,如果是0,那么证明两个表结果集肯定一致 ,反之不一致  
    78.          oi_return := minus_count;  
    79. end if;  
    80.   
    81. EXCEPTION  
    82. WHEN OTHERS THEN  
    83. 'Error' || TO_CHAR(SQLCODE) || ':' || SQLERRM;  
    84.       oi_return:= SQLCODE;  
    85.     DBMS_OUTPUT.PUT_LINE(v_err_desc);  
    86. end compareTableData;