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的使用-分页的更多相关文章

  1. 使用rownum对oracle分页

    以Student表为例进行分页 建表及插入 -- 有表结构如下 create table STUDENT ( sno INTEGER, sname ), sage INTEGER ); -- 插入数据 ...

  2. Oracle ROWNUM用法和分页查询总结(转)

    [转载] Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. Oracle分页查询格式(一):http://yangtingkun.itpub.net/post/468/100278 ...

  3. Oracle ROWNUM用法和分页查询总结

    **************************************************************************************************** ...

  4. 使用rownum对oracle分页【原】

    以Student表为例进行分页 建表及插入 -- 有表结构如下 create table STUDENT ( sno INTEGER, sname ), sage INTEGER ); -- 插入数据 ...

  5. [转]Oracle ROWNUM用法和分页查询总结

    本文转自:http://blog.csdn.net/fw0124/article/details/42737671 ****************************************** ...

  6. Oracle 分页 ROWNUM 两种分页方法和ROWID用法

    一 原因一 oracle默认为每个表生成rowmun,rowid字段,这些字段我们称之为伪列 测试表 CREATE TABLE A ( AID NUMBER() primary key, ANAME ...

  7. Oracle rownum用法、分页

    转载:ORACLE 中ROWNUM用法总结!  第一部分 1.对于 Oracle 的 rownum 问题,很多资料都说不支持 >, >= , =,  between...and ,只能用 ...

  8. Oracel用rownum实现真分页

    因为oracle的rownum是一个伪列,使用的时候如果要用必须查询出来显示的标记例如本sql中标记为 num. 值得一提的是最内层的这个查询sql:“select a.集团规范编码...”本身有一个 ...

  9. [转]Oracle中使用Rownum分页详细例子

    原文地址:http://www.jb51.net/article/52272.htm 在MySQL中,我们通常都使用limit来完成数据集获取的分页操作,而在Oracle数据库中,并没有类似limit ...

随机推荐

  1. getgrgid()函数

    getgrgid(从组文件中取得指定gid 的数据)相关函数 fgetgrent,getgrent,getgrnam表头文件 #include<grp.h>#include<sys/ ...

  2. codeforces 几道题目

    BZOJ挂了....明天就要出发去GDKOI了....不能弃疗. 于是在cf水了几道题, 写写详(jian)细(dan)题解, 攒攒RP, 希望GDKOI能好好发挥.......  620E. New ...

  3. JFrame??

    swing的三个基本构造块:标签.按钮.文本字段.但需要个地方安放他们,并希望用户如何处理他们.JFrame类就是解决这个问题————它是一个容器,允许程序员把其他组件添加到它里面,把它们组织起来,并 ...

  4. Android 添加菜单项

    刚开始看郭大神的<>,实现以下里面的一些例子.利用Menu给APP添加一个菜单项. 效果图 结构图 在res的menu文件夹下创建一个xml文件,当然你也可以使用系统创建的main.xml ...

  5. EditPlus 快速去重

  6. WIN ERROR:C:\Windows\System32\<LANG_NAME>\mstsc.exe.MUI

    Issue: When you upgrade Win7, you may found your remote desktop will not work. You may get following ...

  7. Aix 文件名补齐及aix6.1 bash安装

    Aix历史查询快捷键=>按ESC+k 设置KSH的自动补全(仅仅是文件名补全,没有命令补全)和历史命令功能 方法一: set -o vi 历史命令功能(esc -,esc +)自动补全文件名(e ...

  8. mvc mvp mvvm区别

    1 mvc是有视图(view),控制器(controller),模型(model)组成 view(用户界面) controller (业务逻辑)            model(数据存储) 接受指令 ...

  9. Necklace of Beads(polya计数)

    Necklace of Beads Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7451   Accepted: 3102 ...

  10. android 常用调用系统功能

    1.从google搜索内容 Intent intent = new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.putEx ...