问题:
客户反馈,上级用户查询的数据与下级查询的数据对不上。
分析:
由于上级用户查询的权限比较大,数据多,不会出现;下级只能查询管辖权限内的数据,而出现问题的多条数据刚好处于分页的最后与下页的开始,猜测可能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引入的虚列。 在物理上这个虚列并不存在,只是在查询时才构造出来。伪列通常是自由分配的,用户无法执行修改等操作。有以下特点:
- ROWNUM 不属于任何表。
- ROWNUM 存在的前提:先有结果表。
- ROWNUM 总是从1开始。
- ROWNUM 一般只和<(<=)一起用。
- 使用 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