oracle进行分页查询时由order by排序引起的数据重复问题

在使用Spring Data的Pageable进行Oracle数据库分页查询时,如果排序字段存在相同值,会导致查询结果顺序错乱。原因是查询过程中先对所有数据排序,再取指定范围,导致不同页码的相同排序值位置不固定。解决方法是在Order By中添加唯一性字段如ID,或者直接手动编写SQL并处理rownum。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

oracle进行分页查询时由order by排序引起的数据重复问题

问题现象

今天使用Spring Data中的pageable(int page,int pagesize,int sort,string sortcolumn)类进行分页查询后,发现在排序的字段sortcolumn有相同数据时,查询结果顺序会出现错乱。

原因

将查询sql打印出来后发现,pageable封装的查询语句是这种格式的

SELECT * FROM (SELECT t.*, ROWNUM AS rowno FROM ( select * from table ORDER BY sortcolumn) t WHERE ROWNUM<#endRow# ) WHERE rowno>=#startRow#

看似这个sql没什么问题,实际执行过程:

select * from table ORDER BY sortcolumn

1.首先取出table表的所有数据,并按照sortcolumn排序,这一步没问题

SELECT t.*, ROWNUM AS rowno FROM (.....) t WHERE ROWNUM<#endRow#

2.取出table表中前#endRow#个数据,问题出在这里。当endRow变化时,查出的顺序也在变。

SELECT * FROM (......) WHERE rowno>=#startRow#

3.取出从第#startRow#个数据后的所有数据。
因为第二步查询的数据顺序变化了,最后截取的数据也不一样。

解决办法

1.order by后面加上唯一性字段,比如id

SELECT * FROM (SELECT t.*, ROWNUM AS rowno FROM ( select * from table ORDER BY sortcolumn,id) t WHERE ROWNUM<#endRow# ) WHERE rowno>=#startRow#

用pageable类就是

import org.springframework.data.domain.PageRequest
val page = PageRequest(currentPage, pageSize, Sort.Direction.DESC, "sortcolumn,id")

2.手写sql,提取rownum到外部

SELECT * FROM (SELECT t.*, ROWNUM AS rowno FROM (select * from table ORDER BY LIST_ORDER) t ) WHERE rowno>=#startRow# and rowno<#endRow#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值