2016 - 2024

感恩一路有你

解决oracle数据库分页中order by后数据重复问题

浏览量:1939 时间:2024-02-02 10:06:43 作者:采采

在开发系统软件时,经常会使用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

)

```

通过修改后,分页查询数据显示正常,不再出现重复值了。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。