如何保证两个结果集完全一致呢?
两个结果集我们可以用A和B来表示
两个集合完全相等,那么我们可以这么认为,集合A中的所有元素都在集合B中;集合B中的所有元素也都在集合A中。
那么在oracle数据库中我们可以通过集合相减的方式实现:
集合A中的所有元素都在集合B中:cnt1 = count(*) from (B minus A) = 0
集合B中的所有元素都在集合A中:cnt2 = count(*) from (A minus B) = 0
那么是否满足上面的条件我们就可以说A集合等于B集合呢?答案是否定的,因为minus有剔重的作用。我们可以举个例子来说明
createtableA (col1varchar2(10),col2varchar2(10));
createtableB (col1varchar2(10),col2varchar2(10));
我们来看一下 A minus B及 B minus A的结果,发现其结果均为空
因此当双向minus结果为空时,我们也不能认为集合A与集合B完全一致。但是假如A和B中均没有重复的数据时,A minus B及 B minus A 结果为空,我们可以认为集合A与集合B完全相同。但是,我们无法预知集合A和集合B中是否一定含有重复元素或者一定没有。
换个思维方式,我们判断集合A和集合B完全一致,我们可以这样认为:集合A中的元素在集合B中存在,并且两集合中相同元素的条数完全相同;集合B中的元素在集合A中存在,并且两集合中相同元素的条数完全相同,那么我们可以认为集合A与集合B完全一致。
查询元素的条数,在oracle数据库中我们可以通过group的方式来实现
当A 与 B元素相同时
因此,我们可以通过方法1
selectcount(*) cnt
from(select*
from(selectcol1,col2,count(1)
fromB
groupbycol1,col2
minus
selectcol1,col2,count(1)
fromA
groupbycol1,col2)
unionall
select*
from(selectcol1,col2,count(1)
fromA
groupbycol1,col2
minus
selectcol1,col2,count(1)
fromB
groupbycol1,col2));
当cnt=0时,我们可以认为集合A与集合B完全一致。
再换一种想法,我们还可以这么认为,当A与B完全一致时,我们将集合A与集合B中的元素进行排序,排序后的集合同样的位置上的元素应该完全一致我们才可以认为集合A与集合B完全一致。这可以通过方法2方式来实现:
selectcount(*)
from( (selectrownumasrn, col1,col2
from(selectcol1,col2
fromA
orderbycol1,col2)
minus
selectrownumasrn, col1,col2
from(selectcol1,col2
fromB
orderbycol1,col2))
unionall
(selectrownumasrn, col1,col2
from(selectcol1,col2
fromB
orderbycol1)
minus
selectrownumasrn, col1,col2
from(selectcol1,col2
fromA
orderbycol1,col2)));