为什么下面两个分页语句查询出来的记录都会有msisdn = 13407711511的记录; 
其中test_a,dim_home_area 表都没有重复的数据 
select * from ( 
select * 
  from (select row_.*, rownum rownum_ 
          from (select a.msisdn,a.name,a.home_county 
                FROM test_a a                
                WHERE  a.home_county in  (select home_area_code  from dim_home_area  where (home_area_group_code = '771')) 
                order by a.home_county) row_ 
          where rownum < 120001 
        ) 
where rownum_ >= 60001  
) where msisdn in (13407711511)  ; 
select * from ( 
select * 
  from (select row_.*, rownum rownum_ 
          from (select a.msisdn,a.name,a.home_county 
                FROM test_a a                
                WHERE  a.home_county in  (select home_area_code  from dim_home_area  where (home_area_group_code = '771')) 
                order by a.home_county) row_ 
          where rownum < 60001 
        ) 
where rownum_ >= 1  
) where msisdn in (13407711511)  ;

解决方案 »

  1.   

    先试试这个
    select * from ( 
    select * 
      from (select row_.*, rownum rownum_ 
              from (select a.msisdn,a.name,a.home_county 
                    FROM test_a a                
                    WHERE  a.home_county in  (select home_area_code  from dim_home_area  where (home_area_group_code = '771')) 
                    order by a.home_county) row_ 
               
            ) 
    where rownum_ >= 60001 and  rownum_ < 120001
    ) where msisdn in (13407711511)  ; 
    select * from ( 
    select * 
      from (select row_.*, rownum rownum_ 
              from (select a.msisdn,a.name,a.home_county 
                    FROM test_a a                
                    WHERE  a.home_county in  (select home_area_code  from dim_home_area  where (home_area_group_code = '771')) 
                    order by a.home_county) row_ 
               
            ) 
    where rownum_ >= 1 and rownum_ < 60001
    ) where msisdn in (13407711511)  ;
      

  2.   

    最好在写存储过程的时候加上查询条件,如果不需要查询条件,传递的参数可以为null。
      

  3.   

    另外这两个sql还可以简化,lz嵌套的层太多了
      

  4.   

    1楼回复的sql是没有问题,不过这样速度较慢,按理说我写的sql是没有问题的,为什么会在两个分页语句中都出现相同记录;另外sql最外层嵌套是没有的,只是为了更明确的说明问题增加进来的。
      

  5.   

    为什么两个分页语句查询出来的排序编号会不一致?一个为37876 一个为63009
    按理排序出来的序号应该是一致的,还是这样写分页语句有bug,不过以前在网上看到的分页语句大都是这样写的。
      

  6.   

    select row_.*, rownum rownum_ from
                   (select a.msisdn,a.name,a.home_country
                    FROM test_a a                
                    WHERE  a.home_county in  (select home_area_code  from dim_home_area  where (home_area_group_code = '771')) 
                    order by a.home_county) row_ 
    where rownum < 120001 
             
    --你这个sql的效果等同于
    select a.msisdn,a.name,a.home_country
    FROM test_a a                
    WHERE  a.home_county in  (select home_area_code  from dim_home_area  where (home_area_group_code = '771')) and  rownum < 120001 order by a.home_county
      

  7.   

    这样效果可能会好点
    select * 
      from (select rownum rownnum_,a.msisdn,a.name,a.home_county 
            FROM test_a a                
            WHERE  a.home_county in  (select home_area_code  from dim_home_area  where (home_area_group_code = '771')) 
            order by a.home_county           
            ) 
    where rownum_ >= 60001 and  rownum_ < 120001; select * 
      from (select rownum rownum_,a.msisdn,a.name,a.home_county 
            FROM test_a a                
            WHERE  a.home_county in  (select home_area_code  from dim_home_area  where (home_area_group_code = '771')) 
            order by a.home_county           
            ) 
    where rownum_ >= 1 and rownum_ < 60001;
      

  8.   

    to  9楼的 
    select rownum rownnum_,a.msisdn,a.name,a.home_county 
            FROM test_a a                
            WHERE  a.home_county in  (select home_area_code  from dim_home_area  where (home_area_group_code = '771')) 
            order by a.home_county     
          
    这样的sql不对吧,如果我把where (home_area_group_code = '771')这个条件去掉即下面的代码,select rownum rownnum_,a.msisdn,a.name,a.home_county 
            FROM test_a a                
            WHERE  a.home_county in  (select home_area_code  from dim_home_area ) 
            order by a.home_county  结果就不是你想要排序了。
     
      

  9.   

     select a.msisdn,a.name,a.home_county 
     FROM test_a a                
     WHERE  a.home_county in  (select home_area_code  from dim_home_area  where (home_area_group_code = '771')) 
     order by a.home_county这个不是先排序完后,在嵌套一层取它的rownum值吗?
      

  10.   

    你没看清楚我写的那个吧,我10楼那个不是排完序取的rownum,我是在排序的时候用rownum给他添加了一列,然后在外层利用添加好的列去取想要的行
    另外,9楼的sql是不对的,我在9楼是想告诉你,你写的那个为什么不对