oracle分页查询数据重复问题的解决
2013-11-18 13:27
274 查看
在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.排序条件如果没有唯一性,那么必须在后边跟上一个唯一性的条件,比如主键。
写道
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.排序条件如果没有唯一性,那么必须在后边跟上一个唯一性的条件,比如主键。
相关文章推荐
- Oracle分页查询排序数据重复问题
- 如何解决oracle分页查询数据重复问题
- 教您如何解决oracle分页查询数据重复问题
- Oracle分页查询排序数据重复问题
- 解决查询重复数据问题的一个特列
- oracle分页查询数据重复问题的解决
- Oracle分页查询排序数据重复问题
- oracle分页查询数据重复问题的解决
- oracle分页查询数据重复问题的解决
- oracle分页查询数据重复问题
- 解决查询MySQL数据库中重复数据的问题
- oracle分页查询出现数据重复问题
- 关于MYSQL通过子查询删除重复数据的for update报错问题解决
- 解决学生信息管理系统之List列表中重复添加相同数据问题。
- easyui关于解决tab添加的页面通过href加载数据内容的页面刷新后form表单重复提交的问题;
- Android解决Intent中的数据重复问题
- 后台分页控件重复查询数据问题
- 压缩、解压 解决 客户端查询大批量数据时等待时间过长的问题
- 解决mybatis查询日期时间数据得到long类型数据的问题
- asp.net mvc利用Json验证数据和导向页面,解决重复提交问题