Oracle ROWNUM排序查询数据丢失

问题:

      客户反馈,上级用户查询的数据与下级查询的数据对不上。

分析:

       由于上级用户查询的权限比较大,数据多,不会出现;下级只能查询管辖权限内的数据,而出现问题的多条数据刚好处于分页的最后与下页的开始,猜测可能SQL语句写的有问题。

  • 核对SQL语句
select *
  from (select ROWNUM orderby, s.*
          from (select * from t order by regioncode, areacode, create_time, companyname) s
         where ROWNUM <= 10
        )
 where orderby > 0

分析完SQL语句,感觉写法不存在问题。

  • 核对数据

       SQL语句没有问题的话,应该数据存在问题。经查询,发现排序的 regioncode,areacode,create_time,companyname 数据是一样的,会不会与 ROWNUM  有关系呢?

  • 研究 ROWNUM 

      查询相关资料,ROWNUM 是Oracle引入的虚列。 在物理上这个虚列并不存在,只是在查询时才构造出来。伪列通常是自由分配的,用户无法执行修改等操作。有以下特点:

  1. ROWNUM 不属于任何表。
  2. ROWNUM 存在的前提:先有结果表。
  3. ROWNUM 总是从1开始。
  4. ROWNUM 一般只和<(<=)一起用。
  5. 使用 ROWNUM 进行分页查询需要把 ROWNUM 转化为实列,并针对 ROWNUM 查询。

     可参考 https://www.cnblogs.com/hqbhonker/p/3608505.html

     研究后发现分页语法也正确,那到了问题出现在什么地方的?

原因:

     猜测可能排序数据一致引起,于是在 order by 后 添加了id,id 为 GUID,调整后,果然分页引起的数据丢失解决了。

select *
  from (select ROWNUM orderby, s.*
          from (select * from t order by regioncode, areacode, create_time, companyname,id) s
         where ROWNUM <= 10
        )
 where orderby > 0

 

 

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值