教您如何解决oracle分页查询数据重复问题

数据库 Oracle
oracle数据的存储位置决定了分页返回的数据的排序,如果数据的物理位置发生了改变,就可能会引起分页数据重复的现象。

oracle分页查询时,会遇到数据重复的问题,下面就教您一个解决oracle分页查询数据重复问题的方法,希望对您能够有所帮助。

在oracle分页查询中,我们采用类似以下所示的公认的比较高效的数据库分页查询语句(Effective Oracle by Design中有描述、众多oracle使用者也做过测试)。

写道

  1. SELECT * FROM  
  2. (  
  3. SELECT A.*, ROWNUM RN  
  4. FROM (SELECT * FROM TABLE_NAME) A  
  5. WHERE ROWNUM <= n)  
  6. WHERE RN > m 

这里的ROWNUM是一个伪列,它是oracle为查询结果所编的一个号,***行的 ROWNUM为1,第二行为2,以此类推。

因为oracle是按块进行读取数据的,如果数据按顺序存储,则可能使读取出来的数据是按顺序的,给用户误解为默认排序。事实上,oracle没有进行任何排序操作,如果sql没有要求排序,oracle会顺序的从数据块中读取符合条件的数据返回到客户端。所以在没有使用排序sql的时候,分页返回的数据可能是按顺序的,也可能是杂乱无章的,这都取决与数据的存储位置。在oracle分页查询过程中,如果数据的物理位置发生了改变,就可能会引起分页数据重复的现象。

所以,要正确使用oracle分页查询,sql语句中必须有排序条件。

但是,在有排序条件的时候,仍然会出现数据重复的现象,这是为什么呢?

通过了解oracle的排序机理就会明白,出现这种情况的原因是因为排序列值的不***性。 Oracle这里使用的排序算法不具有稳定性,也就是说,对于键值相等的数据,这种算法完成排序后,不保证这些键值相等的数据保持排序前的顺序。

解决的方法是在后边增加一个***性列,比如主键。

所以解决方法如下(两个条件必须同时满足):

1.sql语句中需要有排序条件。

2.排序条件如果没有***性,那么必须在后边跟上一个***性的条件,比如主键。

 

 

【编辑推荐】

Oracle with语句的用法

查询Oracle日志文件的方法

Oracle并行查询方式的利用

oracle并行查询一列的实现

Oracle分页查询语句介绍

责任编辑:段燃 来源: 互联网
相关推荐

2010-10-27 16:56:05

Oracle重复记录

2010-10-08 11:41:38

PHP连接MYSQL

2010-11-18 16:27:37

2010-11-24 14:03:28

mysql表索引

2010-09-24 18:47:23

SQL数据分页

2010-04-29 17:46:31

Oracle死锁

2010-10-26 10:48:16

ORACLE备份

2010-11-18 16:41:13

oracle死锁

2010-09-26 13:51:48

SQL游标

2010-10-27 17:04:41

Oracle动态查询

2010-10-28 11:29:18

ORACLE用户权限

2010-11-16 09:49:22

Oracle重建索引

2010-08-26 10:29:11

DB2许可证

2021-11-09 10:20:15

MySQL深分页数据库

2021-09-26 06:43:07

MySQL深分页优化

2021-09-27 13:33:03

MySQL深分页数据库

2010-11-25 14:56:46

MySQL全文查询

2010-11-25 10:44:30

2010-09-26 13:56:43

SQL远程查询

2020-12-14 06:57:37

shell
点赞
收藏

51CTO技术栈公众号