oracle 分页 数据重复 数据不正确
oracle 分页 数据重复 数据不正确
嗯嗯是哦 发表于3年前
oracle 分页 数据重复 数据不正确
  • 发表于 3年前
  • 阅读 525
  • 收藏 9
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: oracle 分页 中一般使用rownum 分页 如果有排序话 就可能出现问题


oracle 一般分页的写法为

select a.id,a.title,rownum as rn,a.create_time from 
                   (select a.* from temp a order by create_time desc) a  where rownum<=20

注意:我用的是 create_time 来进行排序 create_time 中有相等的

为了对比分页数据的差异我用left join 来看数据是否正常

这个是用的一个分页 我用了关联来对比分20条数据和10的数据之间的差异

select a.title,a.rn,b.title,b.rn from 
           (select a.id,a.title,rownum as rn,a.create_time from 
                   (select a.* from temp a order by create_time desc) a  where rownum<=20) a
   left join
           (select a.id,a.title,rownum as rn,a.create_time from 
                   (select a.* from temp a order by create_time desc) a  where rownum<=10) b
 on a.id=b.id

执行结果

按道理是右边前面10条会和左边前面10条数据一样 但是运行后是不一样的 

果这样的话 会有在翻页钟可能出现一条记录会在多个页面出现的现象 甚至多个页面数据一样

sql调整后 在嵌套一层

select a.* from 
           (select a.id,a.title,rownum as rn,a.create_time from 
                   (select a.* from temp a order by create_time desc) a) a  where a.rn<=20
select a.title,a.rn,b.title,b.rn from 
   (select a.* from 
           (select a.id,a.title,rownum as rn,a.create_time from 
                   (select a.* from temp a order by create_time desc) a) a  where a.rn<=20) a
   left join
   (select a.* from 
           (select a.id,a.title,rownum as rn,a.create_time from 
                   (select a.* from temp a order by create_time desc) a) a  where a.rn<=10) b
 on a.id=b.id

执行结果对比

这样结果 就对的上了


有没有发现虽然是相同的sq 套了一层select后结果集都变了 前后两张图片的 左列结果都不是一样的



总结  我这里用的时间排序 其中时间相等的数据很多 如果排序字段唯一 应该不会有这种问题出现




  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 3
博文 11
码字总数 6112
×
嗯嗯是哦
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: