数据库_ PL/SQL 怎么判断两个结果集是否相等

数据库服务器: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.  src_table_count int;  
  10.  --目标表格函数  
  11.  dest_table_count int;  
  12.     --两个表格数据(即结果集)之间的差集的个数  
  13.  minus_count 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.        selectSrcSql:=' 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.       selectDestSql:=' 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.        selectSrcMinusDestSql:='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.        selectDestMinusSrcSql:='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.         v_err_desc := 'Error' || TO_CHAR(SQLCODE) || ':' || SQLERRM;  
  84.       oi_return:= SQLCODE;  
  85.     DBMS_OUTPUT.PUT_LINE(v_err_desc);  
  86. end compareTableData;  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值