昨天做完项目后让测试测试了一把,测试说分页查询貌似不起作用,翻到第4页以后,看到的数据结果都是相同的。
当时我就觉得很纳闷,不可能啊,分页组件应该是好的,咋可能有问题呢。带着疑问,我打开了自己的ide,在自己的机器上跑了一把,果然有问题。
有问题就要找问题:
首先把2条查询结果相同的sql打印出来到数据库中执行:
sql1: select * from (select t.*, rownum rn from (select t_e_id, t_e_name, t_e_tel, t_e_areacode from (select t.eid t_e_id, t.ename t_e_name, t.etel t_e_tel, t.areaid t_e_areacode, t.biz_delete_time, decode(areaid, '0730', '0', '1') orderseq from vr_enterprise t where t.eid not in (select eid from t_biz_erelation)) order by orderseq, biz_delete_time nulls last) t where rownum < 25) where rn >= 19 sql2: select * from (select t.*, rownum rn from (select t_e_id, t_e_name, t_e_tel, t_e_areacode from (select t.eid t_e_id, t.ename t_e_name, t.etel t_e_tel, t.areaid t_e_areacode, t.biz_delete_time, decode(areaid, '0730', '0', '1') orderseq from vr_enterprise t where t.eid not in (select eid from t_biz_erelation)) order by orderseq, biz_delete_time nulls last) t where rownum < 18) where rn >= 12
结果显示大多数行是相同的。
为了找到问题所在,只有先一步一步的精简化sql,看在哪一步出的问题。
于是找到了,问题出现在where rownum<18的时候数据改变了,为什么加了个where条件结果就会变呢?
表示想不通啊。。。。。
没办法,只好baidu了,baidu了半天,都没人给个解释啊。。。。。
后来同事说,换个写法试试,于是改了另一种写法,如下:
select * from (select t.*, rownum rn from (select t_e_id, t_e_name, t_e_tel, t_e_areacode from (select t.eid t_e_id, t.ename t_e_name, t.etel t_e_tel, t.areaid t_e_areacode, t.biz_delete_time, decode(areaid, '0730', '0', '1') orderseq from vr_enterprise t where t.eid not in (select eid from t_biz_erelation)) order by orderseq, biz_delete_time nulls last) t) m where m.rn >= 1 and m.rn < 25
这个方法果然凑效,凑效是凑效,关键是为什么前面那种方法不行呢?抓问题要刨根问底。
看来baidu不行,得换google搜索了。找呀找找呀找,在oracle的ask tom上,tom详细的介绍了rownum的用法,在这里http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html
One important thing about using this pagination query is that the ORDER BY statement should order by something unique. If what you are ordering by is not unique, you should add something to the end of the ORDER BY to make it so.
看到这样一句话,原来用order by的时候还需要增加order by的唯一性,不然rownum就会有问题。
相关推荐
Oracle提供了一种名为ROWNUM的伪列,它会为每一行返回一个唯一的数字,从1开始递增。通过ROWNUM,我们可以实现简单的分页。例如,如果我们想获取第1页(通常包含前10条记录),可以编写如下的SQL查询: ```sql ...
在数据库管理领域,分页查询是一项非常常见的操作,特别是在处理大量数据时,为了提高用户体验和系统性能,我们通常不会一次性加载所有数据,而是选择性地加载一部分,这就是分页的作用。本篇将深入探讨TERADATA和...
本篇文章将深入探讨Oracle分页的机制,并提供易于理解的示例。 首先,我们来看SQL标准的`OFFSET-FETCH`和`LIMIT`子句。虽然`LIMIT`不是Oracle的原生语法,但Oracle 12c引入了`FETCH FIRST n ROWS ONLY`和`OFFSET m ...
但要注意,ROWNUM的值在子查询中会被重置,因此在构建分页查询时,我们需要巧妙地使用子查询或连接来保持其正确性。 分页查询的基本结构如下: ```sql SELECT * FROM ( SELECT t.*, ROWNUM AS rn FROM (SELECT *...
2. ROW_NUMBER() over()分页:Oracle 10g及以上版本引入了窗口函数ROW_NUMBER(),它可以为查询结果集的每一行分配一个唯一的行号。结合PARTITION BY和ORDER BY子句,我们可以实现更灵活的分页。以下是一个示例: ``...
Oracle 12c引入了FETCH FIRST子句,它简化了分页查询,如下所示: ```sql CREATE OR REPLACE PROCEDURE get_paged_data (start_row IN NUMBER, page_size IN NUMBER, cursor OUT SYS_REFCURSOR) IS BEGIN OPEN...
在Oracle数据库中,分页查询是一项非常常见的操作,特别是在数据量庞大的情况下,为了提高用户体验,避免一次性加载过多数据导致页面响应变慢,我们通常会采用分页的方式展示数据。本篇将详细介绍Oracle数据库中的...
在处理大数据时,ROWNUM可能会遇到问题,因为它会在内存中累积所有符合条件的行,然后再过滤。因此,对于大数据量的分页,使用窗口函数或新的FETCH语法通常更有效。 通过理解这些Oracle分页技术,开发者可以更好地...
综上所述,这个"oracle和mssql分页存储过程-均通用"的压缩包文件提供了一个跨平台的解决方案,帮助开发者在Oracle和MSSQL数据库中轻松实现高效的分页查询,同时提高了代码的可维护性和复用性。在实际应用中,应结合...
总结来说,Oracle分页主要通过ROWNUM和ROW_NUMBER()函数实现,其中ROW_NUMBER()更为灵活且适用于复杂场景。合理利用索引和动态分页策略,可以提高查询效率和用户体验。在设计分页系统时,需兼顾性能和用户体验,为...
Oracle中实现分页查询的主要方法有两种:ROWNUM和ROW_NUMBER()函数,以及Oracle的高级分页特性——FETCH NEXT和OFFSET。 1. ROWNUM方法:ROWNUM是Oracle中的一个伪列,它表示行的顺序号,从1开始。我们可以结合子...
`ROWNUM`在早期版本的Oracle中被广泛使用,它会为每行数据分配一个唯一的数字,通过与特定范围的比较来获取指定页的数据。然而,这种方式存在一些限制,例如无法跨行集过滤,效率较低。 在Oracle 12c及以上版本,...
综上所述,`ROWNUM` 和 `ROWID` 在Oracle数据库中都有其独特的应用场景。`ROWNUM` 主要用于限制查询结果的数量或实现分页查询等功能;而 `ROWID` 则主要用于快速定位和稳定查询特定记录。在实际开发过程中,根据需求...
在描述中提到的问题中,当使用`ORDER BY`对包含非唯一值的列进行排序,并结合分页查询时,发现不同页码的数据可能会有重复。这进一步证实了`ORDER BY`在Oracle中的不稳定特性。在没有唯一索引或主键约束的情况下,...
这种方式避免了 ROWNUM 与 ORDER BY 结合时可能出现的问题,因为 ROWNUM 会优先于 ORDER BY 应用,可能导致预期之外的结果。 4. **JOIN操作**:在某些复杂情况下,可能需要将行号分配与其他表的JOIN操作结合使用,...
综上所述,Oracle伪列如ROWID和ROWNUM在实际应用中发挥着重要作用,不仅可以帮助优化查询性能,还能轻松实现复杂的分页功能。同时,通过Java JDBC编程,可以进一步提升应用程序与Oracle数据库的集成度和灵活性。
综上所述,这个Oracle分页框架的源码包含了如何在Java Web应用中使用Oracle进行分页查询的关键步骤,包括Action层的SQL构造和JSP页面的分页展示。通过学习和理解这些代码,开发者可以更好地掌握在实际项目中实现高效...
### Oracle分页查询详解 #### 一、Oracle分页查询基础 在Oracle数据库中,实现分页查询是一项常见的需求,特别是在处理大量数据时。本文将详细介绍Oracle中的分页查询技术,帮助初学者快速掌握这一技能。 #### 二...
3. **非唯一性**:同一行号可能对应多行数据,因为`ROWNUM`在结果集生成过程中逐行分配。 三、ROWID与ROWNUM的联合使用 虽然`ROWID`和`ROWNUM`都与表行相关,但它们的作用不同,有时可以结合起来使用。例如,当我们...
总结,Oracle分页是数据库管理中的关键技能,无论是ROWNUM还是ROW_NUMBER(),都能帮助我们有效地处理大数据量的查询。理解并掌握这些技术,对于提升数据库性能和用户体验具有重要意义。在实际应用中,根据数据量、...