sql性能优化结果集一致办法
如何保证两个结果集完全一致呢两个结果集我们可以用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元素相同时因此我们可以通过方法1selectcount(*) cntfrom(select*from(selectcol1,col2,count(1)fromBgroupbycol1,col2minusselectcol1,col2,count(1)fromAgroupbycol1,col2)unionallselect*from(selectcol1,col2,count(1)fromAgroupbycol1,col2minusselectcol1,col2,count(1)fromBgroupbycol1,col2));当cnt0时我们可以认为集合A与集合B完全一致。再换一种想法我们还可以这么认为当A与B完全一致时,我们将集合A与集合B中的元素进行排序排序后的集合同样的位置上的元素应该完全一致我们才可以认为集合A与集合B完全一致。这可以通过方法2方式来实现selectcount(*)from( (selectrownumasrn, col1,col2from(selectcol1,col2fromAorderbycol1,col2)minusselectrownumasrn, col1,col2from(selectcol1,col2fromBorderbycol1,col2))unionall(selectrownumasrn, col1,col2from(selectcol1,col2fromBorderbycol1)minusselectrownumasrn, col1,col2from(selectcol1,col2fromAorderbycol1,col2)));