解决oracle数据库分页中order by后数据重复问题
在开发系统软件时,经常会使用oracle数据库分页查询。然而,最近我发现即使分页sql组装正确,每次点击下一页显示的数据都是一样的。本文将简要介绍解决此问题的思路。
分页sql示例
我的分页sql如下所示:
```sql
select *
from(
select rownum rowno, tt.*
from(
select a.*
from ...
where ...
order by ..., lrsj
) tt
where rownum < n1
) table_alias
where table_ > n2
```
在查询过程中,n1和n2的配置为20、11,30、21,40、31等时,查询出的数据会有重复。
问题分析
经过分析发现,根据jgdm排序后,当jgdm相同的数据有很多个时,并没有给它一个排序规则。也就是说,不能保证每次分页查询时的记录的rownum一致。因此得到的数据也不是我们预想的。经过测试,的确如此。
解决方法一:修改order by字段
第一种解决方法是修改select语句后的order by字段,使排序规则有效。比如,可以首先按机构排序,然后按主键排序,或者干脆按rowid排序。不过后者可能没有什么业务含义。由于是生产环境,不便于修改程序,因此我没有采用此方法解决。
解决方法二:修改排序字段数据内容
第二种解决方法是修改排序字段的数据内容。由于排序字段数据重复,导致排序结果无规则。为了先解决问题,我选择了修改数据内容,使排序有效。在这里需要一些技巧,如何修改lrsj字段值保证排序有效,而又不改变时间字段太多。我的做法是将lrsj值修改为lrsj rownum/24/60/60,即按行号增加1秒。具体的sql如下:
```sql
update ... a
set (
select rn/24/60/60
from(
select rid, rownum rn, a.*
from ... a
) b
where b.rid
)
```
通过修改后,分页查询数据显示正常,不再出现重复值了。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。