rownum的使用-分页
oracle分页显示方法
一、使用rownum分页显示方式
方式1:
SELECT *
FROM (SELECT ROWNUM r, a.* FROM b$i_exch_info a WHERE ROWNUM <= 10)
WHERE r >= 5;
方式2:
SELECT *
FROM (SELECT ROWNUM r, a.* FROM b$i_exch_info a)
WHERE r BETWEEN 5 AND 10;
方式3:
SELECT * FROM b$i_exch_info WHERE ROWNUM <= 10 MINUS
SELECT * FROM b$i_exch_info WHERE ROWNUM < 5;
二、使用分析函数row_number分页显示
SELECT *
FROM (SELECT e.*, row_number() over(ORDER BY g3e_fid) r
FROM b$i_exch_info e) a
WHERE a.r >= 5
AND a.r <= 10;
注意事项
1.
--10g及10g之后才可以使用rownum=1
SELECT * FROM user_objects
WHERE /*object_id <100
AND*/ ROWNUM = 1;
--之前的版本
SELECT * FROM user_objects
WHERE object_id <100
AND ROWNUM <= 1;
2.
rownum采用大于号>时 其值必须小于1,否则查询无结果
SELECT * FROM user_objects
WHERE ROWNUM >1;
>= 时其值必须小于或等于1,否则查询无结果
SELECT * FROM user_objects
WHERE ROWNUM >=2;
= 时其只能等于1,否则查询无结果
SELECT * FROM user_objects
WHERE ROWNUM =2;
3.ROWNUM 和Order BY
在使用ROWNUM 时,只有当Order By 的字段是主键时,查询结果才会先排序再计算ROWNUM:
g3e_ano是主键
SELECT g3e_ano,g3e_username FROM g3e_attribute WHERE ROWNUM <= 5 ORDER BY g3e_ano;
1 备注
1002 组件序号
1008 组件序号
1009 组件序号
1010 组件序号
--以下查询因为ORDER BY的g3e_username不是主键,所以执行时是先线取出该表的6条数据,再对g3e_username排序
SELECT g3e_ano,g3e_username FROM g3e_attribute WHERE ROWNUM <= 5 ORDER BY g3e_username;
111003 设施特征唯一号
113203 设施特征唯一号
50110 设施特征唯一号
1510103 设施特征唯一号
112003 设施特征唯一号
--如果需要对非主键字段先排序再去取前n 条数据,可以通过子查询的方式实现:
select g3e_ano, g3e_username
from (select g3e_ano, g3e_username
from g3e_attribute
order by g3e_username)
where rownum <= 5;
--每页按10条记录输出(如果被排序的字段有重复值,使用rownum会出现一个问题):
--观察下面两个语句的输出结果会发现其中55461451和55461209是在两个查询中都出现了。而fid在表中都是唯一记录的,
--说明这个输出结果是错误的
错误原因:SORT (ORDER BY STOPKEY)这种快速排序方法由于是根据数据分组来选择数据的,不是根据整个表的数据进行排序,所以N
值不同,数据的分组也不同,导致结果在数据的排序字段值都相等时,输出结果的顺序就会因为N 值不同而不同。
SELECT *
FROM (SELECT ROWNUM r, a.*
FROM (SELECT name, g3e_fid FROM b$l_interest_info a ORDER BY name) a
WHERE ROWNUM <= 10)
WHERE r >= 1;
1 王家宅 55461079
2 王家宅 55461206
3 王家宅 55461207
4 王家宅 55461253
5 王家宅 55461246
6 王家宅 55461209
7 王家宅 55461783
8 王家宅 55461646
9 王家宅 55461586
10 王家宅 55461451
SELECT *
FROM (SELECT ROWNUM r, a.*
FROM (SELECT name, g3e_fid FROM b$l_interest_info a ORDER BY name) a
WHERE ROWNUM <= 20)
WHERE r >= 11;
11 王家宅 56990485
12 王家宅 56990368
13 王家宅 56981862
14 王家宅 56981861
15 王家宅 56981807
16 王家宅 56981806
17 王家宅 56981801
18 王家宅 55461646
19 王家宅 55461451
20 王家宅 55461209
解决办法:
1、让查询计划避免“SORT (ORDER BY STOPKEY)”,采用“SORT (ORDER BY)”,使数
据排序不受ROWNUM 的影响。但这样会使所有数据都做排序:
SELECT *
FROM (SELECT a.*, ROWNUM r
FROM (SELECT name, g3e_fid FROM b$l_interest_info a ORDER BY name) a)
WHERE r <= 10
AND r >= 1;
SELECT *
FROM (SELECT a.*, ROWNUM r
FROM (SELECT name, g3e_fid FROM b$l_interest_info a ORDER BY name) a)
WHERE r <= 20
AND r >= 11;
2、在排序时,加上一个或多个字段(如主键字段、ROWID),使排序结果具有唯一性:
SELECT *
FROM (SELECT ROWNUM r, a.*
FROM (SELECT name, g3e_fid FROM b$l_interest_info a ORDER BY name,g3e_fid) a
WHERE ROWNUM <= 10)
WHERE r >= 1;
SELECT *
FROM (SELECT ROWNUM r, a.*
FROM (SELECT name, g3e_fid FROM b$l_interest_info a ORDER BY name,g3e_fid) a
WHERE ROWNUM <= 20)
WHERE r >= 11;
3、对排序字段建立索引,并强制使用索引。这样就能利用索引已经建立好的排序结果:
CREATE INDEX idx_b$l_interest_info_name ON b$l_interest_info(name);
ALTER INDEX idx_b$l_interest_info_name REBUILD;
SELECT *
FROM (SELECT ROWNUM r, a.*
FROM (SELECT /*+index(a idx_b$l_interest_info_name)*/
name, g3e_fid
FROM b$l_interest_info a
WHERE a.name IS NOT NULL
ORDER BY name) a
WHERE ROWNUM <= 10)
WHERE r >= 1;
SELECT *
FROM (SELECT ROWNUM r, b.*
FROM (SELECT /*+index(a idx_b$l_interest_info_name)*/
a.name, a.g3e_fid
FROM b$l_interest_info a
WHERE a.name IS NOT NULL
ORDER BY a.name) b
WHERE ROWNUM <= 20)
WHERE r >= 11;
rownum的使用-分页的更多相关文章
- 使用rownum对oracle分页
以Student表为例进行分页 建表及插入 -- 有表结构如下 create table STUDENT ( sno INTEGER, sname ), sage INTEGER ); -- 插入数据 ...
- Oracle ROWNUM用法和分页查询总结(转)
[转载] Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. Oracle分页查询格式(一):http://yangtingkun.itpub.net/post/468/100278 ...
- Oracle ROWNUM用法和分页查询总结
**************************************************************************************************** ...
- 使用rownum对oracle分页【原】
以Student表为例进行分页 建表及插入 -- 有表结构如下 create table STUDENT ( sno INTEGER, sname ), sage INTEGER ); -- 插入数据 ...
- [转]Oracle ROWNUM用法和分页查询总结
本文转自:http://blog.csdn.net/fw0124/article/details/42737671 ****************************************** ...
- Oracle 分页 ROWNUM 两种分页方法和ROWID用法
一 原因一 oracle默认为每个表生成rowmun,rowid字段,这些字段我们称之为伪列 测试表 CREATE TABLE A ( AID NUMBER() primary key, ANAME ...
- Oracle rownum用法、分页
转载:ORACLE 中ROWNUM用法总结! 第一部分 1.对于 Oracle 的 rownum 问题,很多资料都说不支持 >, >= , =, between...and ,只能用 ...
- Oracel用rownum实现真分页
因为oracle的rownum是一个伪列,使用的时候如果要用必须查询出来显示的标记例如本sql中标记为 num. 值得一提的是最内层的这个查询sql:“select a.集团规范编码...”本身有一个 ...
- [转]Oracle中使用Rownum分页详细例子
原文地址:http://www.jb51.net/article/52272.htm 在MySQL中,我们通常都使用limit来完成数据集获取的分页操作,而在Oracle数据库中,并没有类似limit ...
随机推荐
- 如何获取浏览器URL中查询字符串的参数
首先要知道Location这个对象以及这个对象中的一些属性: href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主 ...
- CxImage整理(叠加字符/图像合并)
//CxImage叠加字符 void CCxImageTestDlg::OnBnClickedButton1() { CxImage imgJPG; // 定义一个CxImage对象 imgJPG.L ...
- PHP zip压缩文件及解压
PHP zip压缩文件及解压 利用ZipArchive 类实现 只有有函数.界面大家自己写 ZipArchive(PHP 5.3 + 已自带不需要安装dll) /** * 文件解压 * @param ...
- 给Extjs的GridPanel增加“合计”行(转)
再Google,找到一个看似写的比较好的 http://www.cnblogs.com/over140/archive/2009/05/06/1449892.html 期间主要部分也是借鉴官方论坛上的 ...
- bootstrap 3 のcheckbox-inline
<div class="form-group"> <p class="control-label"><b> ...
- ISO和UDF光盘格式、扩展ISO9660----Joliet和Romeo文件系统
ISO和UDF光盘格式.扩展ISO9660----Joliet和Romeo文件系统 刻录DVD盘,当文件大于2G的时候,Nero会提示NERO选文件时提示无法刻录这么大的文件,请转换格式.这到底是怎么 ...
- CentOS安装与配置LNMP
本文PDF文档下载:http://www.coderblog.cn/doc/Install_and_config_LNMP_under_CentOS.pdf 本文EPUB文档下载:http://www ...
- 《C语言深度剖析》学习笔记----C语言中的符号
本节主要讲C语言中的各种符号,包括注释符.单引号双信号以及逻辑运算符等. 一.注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空 ...
- 基于Platinum库的DMS实现(android)
接上篇博文:基于Platinum库的DMR实现(android) 文章讲述了如何使用Platinum库实现DMR 今天同样使用该库,来讲解一下DMS的实现 关于该库如何编译,请参考这篇博文:NDK下 ...
- javascript高级程序设计一(80-116)
81.函数内部属性:arguments.arguments.callee.this. window.color = "red"; var o={color:"blue&q ...