数据库分页时order by排序不唯一,分页出现重复数据问题

前些天出现了一个非常有意思的问题,sql简单化出来以后是下面这个样:
select * from(
SELECT tmp_page.*,
    rownum row_id FROM (  
SELECT * FROM T_BAP_MEC_TZERO_STL ORDER BY dt_ute  desc nulls last
)tmp_page  WHERE rownum<10

)where row_id>0

出现的问题是前面几页的数据几乎一样


那么为什么会导致这样的问题出现呢?

为了重现问题我重现建立了一张表方便缩小研究范围,排除非影响因素

create table ttt1 (a varchar2(3),b number);
insert into ttt1 values('a',1);
   insert into ttt1 values('b',1);
   insert into ttt1 values('c',1);
  insert into ttt1 values('d',1);
   insert into ttt1 values('e',1);
  insert into ttt1 values('f',1);
   insert into ttt1 values('g',1);
   insert into ttt1 values('h',1);
   insert into ttt1 values('i',1);
   insert into ttt1 values('j',1);
insert into ttt1 values('k',1);
 insert into ttt1 values('l',2);
 insert into ttt1 values('m',3);
  insert into ttt1 values('m1',3);
  insert into ttt1 values('m2',3);
  insert into ttt1 values('m3',3);
  insert into ttt1 values('m4',3);
  insert into ttt1 values('m5',3);
  insert into ttt1 values('m6',3);
  insert into ttt1 values('m7',3);
  insert into ttt1 values('m8',3);
  insert into ttt1 values('m9',3);
  insert into ttt1 values('m10',3);
insert into ttt1 values('m11',3);
insert into ttt1 values('m12',3);
insert into ttt1 values('m13',3);
 insert into ttt1 values('n',null);
 insert into ttt1 values('o',null);
 insert into ttt1 values('p',null);
 insert into ttt1 values('k',null);
 insert into ttt1 values('r',null);
 insert into ttt1 values('s',null);
 insert into ttt1 values('t',null);
 insert into ttt1 values('u',null);
 insert into ttt1 values('v',null);
 insert into ttt1 values('w',null);

  
SELECT tmp_page.*,  
      ROWID FROM (    
  SELECT * FROM ttt1   order by b  desc
  )tmp_page  WHERE rownum<=5



SELECT tmp_page.*,  
      ROWID FROM (    
  SELECT * FROM ttt1   order by b  desc
  )tmp_page  WHERE rownum<=10

  select * from(  
  SELECT tmp_page.*,  
      ROWID FROM (    
  SELECT * FROM ttt1   order by b desc
  )tmp_page  WHERE rownum<=5
  )where row_id>0;

  select * from(  
  SELECT tmp_page.*,  
      rownum row_id FROM (    
  SELECT * FROM ttt1   order by b desc
  )tmp_page  WHERE rownum<=10
  )where row_id>5;

1.这样你就能缩小答案范围在rownum取值这里,因为第一次取记录数5条的时候,k在第5位,而第二次k排在了第6位,所以第一页和第二页都出现了k记录。

2.在转换一下:



当你order by 不能保证唯一性的时候,rownum是怎么去选择前5条记录的呢?为什么不是

  SELECT a,b,rowid FROM ttt1    order by b desc

的前5条记录呢?那么到底是rownum还是order by 导致的最终问题呢?

如果是升序的还好,他会根据物理存放顺序来取数据,但是倒序的话很明显变成的随机性,这里假设









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值