数据库服务器: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;