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

oracle分页查询数据重复问题

阅读更多

在oracle分页查询中,我们采用类似以下所示的公认的比较高效的数据库分页查询语句(Effective Oracle by Design中有描述、众多oracle使用者也做过测试)。
写道  SELECT * FROM (  SELECT A.*, ROWNUM RN  FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= n) WHERE RN > m  这里的ROWNUM是一个伪列,

它是oracle为查询结果所编的一个号,第一行的ROWNUM为1,第二行为2,以此类推。 因为oracle是按块进行读取数据的,
如果数据按顺序存储,则可能使读取出来的数据是按顺序的,给用户误解为默认排序。

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

但是,在有排序条件的时候,仍然会出现数据重复的现象,这是为什么呢?
通过了解oracle的排序机理就会明白,出现这种情况的原因是因为排序列值的不唯一性。 Oracle这里使用的排序算法不具有稳定性,
也就是说,对于键值相等的数据,这种算法完成排序后,不保证这些键值相等的数据保持排序前的顺序。

解决的方法是在后边增加一个唯一性列,比如主键。
所以解决方法如下(两个条件必须同时满足):
 1.sql语句中需要有排序条件。
 2.排序条件如果没有唯一性,那么必须在后边跟上一个唯一性的条件,比如主键。

分享到:
评论
2 楼 yu_meiguang 2016-06-16  
真心感谢啊,找了半天才知道是这个以时间戳问题导致的问题
1 楼 字母哥 2014-06-10  
不错 今天用到了 时间戳排序的话有一样的就排序数据乱了

相关推荐

    oracle rownum 学习

    内涵oracle rownum的详细讲解。

    oracle 采用三层结构分页后有的页数据重复问题

    NULL 博文链接:https://xiaoxinshome.iteye.com/blog/1890709

    Oracle中使用伪列rownum实现分页查询

    rownum是查询返回的结果集中行的序号,可以使用它来限制查询返回的行数 从emp表中查询薪水排在前三位的记录 select * from( select * from emp order by sal desc ) where rownum&lt;=3 结果如下: 原创文章 4获赞...

    oracle经典面试题oracle经典面试题oracle经典面试题

    ORACLE是ORACLE公司的数据产品,支持海量数据存储,支持分布式布暑,支持多用户,跨平台,数据安全完整性控制性能优越,是一个ORDBMS,一般用在大型公司。 2、能不能设计数据库?如何实现数据库导入与导出的更新 ...

    oracle使用管理笔记(一些经验的总结)

    10.oracle分页查询 21 (1)删除重复记录 22 11.oracle合并查询 24 12.oracle连接 25 13.oracle函数 26 (1)字符函数 26 (2)数学函数 26 (3)日期函数 27 (4)给表取别名的时候,不能加as;但是给列取别名,是可以加as 27...

    Oracle数据库中ORDER BY排序和查询按IN条件的顺序输出

    发现用一个type进行排序后,做分页查询,第一页的数据和第二页的数据有重复 怀疑是order by 时,两次排列的顺序不一致 看到业务描述的问题可以得到的结论order by排序不稳定,还有第一个印象就是,type肯定是不唯一...

    ORACLE9i_优化设计与系统调整

    §1.1.1 Oracle数据字典 23 §1.1.2 表空间与数据文件 24 §1.1.3 Oracle实例(Instance) 24 §1.2 Oracle文件 26 §1.2.1 数据文件 26 §1.2.2 控制文件 26 §1.2.3 重做日志文件 26 §1.2.4 其它支持文件 26 §...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

     数据查询语言 (Data Query Language, DQL) 是SQL语言中,负责进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。例如:SELECT(查询)  数据控制语言Data Controlling Language(DCL),用来...

    Oracle数据库、SQL

    十五、 排名分页问题 30 15.1什么是rownum 30 15.2 where rownum的执行过程 30 15.3 where rownum=5的执行过程 30 十六、 约束constraint 31 16.1约束的类型 31 16.2 primary key:主键约束 31 16.3 not null:非空...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例129 去除数组中的重复元素 158 实例130 字符串与数组的转换 159 实例131 对数组元素进行随机排序 160 实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 获取数组当前的键名和值 162 实例135 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例129 去除数组中的重复元素 158 实例130 字符串与数组的转换 159 实例131 对数组元素进行随机排序 160 实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 获取数组当前的键名和值 162 实例135 ...

    C#.net_经典编程例子400个

    74 实例064 利用选择控件实现复杂查询 76 2.7 ListView控件应用 78 实例065 ListView列表拒绝添加重复信息 78 实例066 将数据库数据添加到ListView控件 80 实例067 用ListView控件制作导航...

    Oracle事例

    14、查询从多少行到多少行的记录(可以用在web开发中的分页显示) select * from ( select rownum row_id,b.* from (select a.* from sys_oper a) b ) where row_id between 15 and 20 15、对公共授予访问权 ...

    程序员的SQL金典6-8

     4.5 抑制数据重复  4.6 计算字段  4.6.1 常量字段  4.6.2 字段间的计算  4.6.3 数据处理函数  4.6.4 字符串的拼接  4.6.5 计算字段的其他用途  4.7 不从实体表中取的数据  4.8 联合结果集  4.8.1 简单的...

    程序员的SQL金典7-8

     4.5 抑制数据重复  4.6 计算字段  4.6.1 常量字段  4.6.2 字段间的计算  4.6.3 数据处理函数  4.6.4 字符串的拼接  4.6.5 计算字段的其他用途  4.7 不从实体表中取的数据  4.8 联合结果集  4.8.1 简单的...

    程序员的SQL金典4-8

     4.5 抑制数据重复  4.6 计算字段  4.6.1 常量字段  4.6.2 字段间的计算  4.6.3 数据处理函数  4.6.4 字符串的拼接  4.6.5 计算字段的其他用途  4.7 不从实体表中取的数据  4.8 联合结果集  4.8.1 简单的...

    程序员的SQL金典3-8

     4.5 抑制数据重复  4.6 计算字段  4.6.1 常量字段  4.6.2 字段间的计算  4.6.3 数据处理函数  4.6.4 字符串的拼接  4.6.5 计算字段的其他用途  4.7 不从实体表中取的数据  4.8 联合结果集  4.8.1 简单的...

    C#程序开发范例宝典(第2版).part13

    实例081 DataGridView控件的分页功能 108 实例082 从DataGridView控件拖放数据至TreeView控件 113 实例083 在DataGridView控件中实现合并单元格 116 实例084 在DataGridView控件中显示图片 118 实例085 为...

Global site tag (gtag.js) - Google Analytics