`
907182878
  • 浏览: 7846 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oracle 排序分页混乱

阅读更多

今天有个需求用oracle排序分页:

sql如下:

 

select *
  from (select id, member_id, company_name, rownum rn
          from (select t.id, t.member_id, t.company_name
                  from table1 t, table2 d
                 where t.id = d.opp_id(+)
                   and product_id_prefer = 1
                   and t.sales_id = 'sunny.zhaoy'
                 order by t.maturity asc, d.memo)
         where rownum <= #endrow#) m
 where m.rn >= #rowid#

 

这个sql是正确的,在开发库用了下,没有问题、、但是提交到测试库就有问题了,第三页和第四页,第五页第六页 怎么查询都是一样的结果。

比如我一页50条,那么下面两个sql查询的结果居然一模一样(总共600条):


 

select *
  from (select id, member_id, company_name, rownum rn
          from (select t.id, t.member_id, t.company_name
                  from table1 t, table2 d
                 where t.id = d.opp_id(+)
                   and product_id_prefer = 1
                   and t.sales_id = 'sunny.zhaoy'
                 order by t.maturity asc, d.memo)
         where rownum <= 150) m
 where m.rn >= 101
 
 ======================================================
 
 select *
  from (select id, member_id, company_name, rownum rn
          from (select t.id, t.member_id, t.company_name
                  from table1 t, table2 d
                 where t.id = d.opp_id(+)
                   and product_id_prefer = 1
                   and t.sales_id = 'sunny.zhaoy'
                 order by t.maturity asc, d.memo)
         where rownum <= 200) m
 where m.rn >= 151

 

 


 

 

基本上应该没啥问题,问题出现在什么地方呢?

首先这跟oracle无关, 是典型的order by字段值不唯一造成分页记录混乱。

也就是说 我用 t.maturity asc, d.memo 排序,但是这两个字段的值可能都是相同的,或者很多都是不唯一的。。这时候就会出现这个问题了。

怎么解决呢?

其实很简单,只要在排序的时候加一个值唯一的字段的就可以了。最好是id

 

改成如下就ok了:

 

select *
  from (select id, member_id, company_name, rownum rn
          from (select t.id, t.member_id, t.company_name
                  from table1 t, table2 d
                 where t.id = d.opp_id(+)
                   and product_id_prefer = 1
                   and t.sales_id = 'sunny.zhaoy'
                 order by t.maturity asc, d.memo,t.id)
         where rownum <= 150) m
 where m.rn >= 101
 
 ======================================================
 
 select *
  from (select id, member_id, company_name, rownum rn
          from (select t.id, t.member_id, t.company_name
                  from table1 t, table2 d
                 where t.id = d.opp_id(+)
                   and product_id_prefer = 1
                   and t.sales_id = 'sunny.zhaoy'
                 order by t.maturity asc, d.memo,t.id)
         where rownum <= 200) m
 where m.rn >= 151

分享到:
评论

相关推荐

    解析函数高效实现分页

    - `ROWNUM`适用于简单的分页场景,但存在排序后行号混乱、不能在`WHERE`子句中使用等问题。 - `ROW_NUMBER()`则能够在排序后为每行分配正确的行号,更加灵活高效。 - **性能对比**: - 大多数情况下,`ROW_NUMBER...

    嵌套查询总结例子

    这种操作顺序可能会导致分页结果的混乱,例如,在需要按特定字段排序并返回前几条记录的场景下,如果直接使用ROWNUM进行限制,可能会得到先未排序后排序的记录,而非真正意义上的“前几条”。 #### 三层嵌套查询...

    数据库分页查询方法

    数据库分页查询是数据库管理系统中一个常见的功能,用于在...同时,保持主键的唯一性对使用TOP和ROW_NUMBER()至关重要,以防止数据排序混乱。在处理联合主键时,需要额外注意查询的编写方式,以确保分页的正确执行。

    通用DbGrid的设计与实现

    用户应能方便地进行行选择、列排序、分页操作,以及通过上下文菜单或工具栏进行数据编辑。为了提高用户体验,可以添加一些高级特性,如行级锁定(用于防止编辑时滚动导致的视觉混乱)、自定义列格式化、数据验证等。...

    jsp+sqlserver2012实现三个班级成绩查询系统

    这些页面应该包含了成绩查询表单、结果显示区以及可能的分页和排序功能。页面通过HTTP请求与服务器通信,传递查询参数,如班级ID或学生姓名,然后服务器根据这些参数执行SQL查询,将结果返回给JSP页面进行显示。 ...

Global site tag (gtag.js) - Google Analytics