八、oracle 分页

oracle的分页一共有三种方式

方法一 根据rowid来分

SELECT *  FROM EMP WHERE ROWID IN       (SELECT RID          FROM (SELECT ROWNUM RN, RID                  FROM (SELECT ROWID RID, EMPNO FROM EMP ORDER BY EMPNO DESC)                 WHERE ROWNUM <= ( (currentPage-1) * pageSize + pageSize )) --每页显示几条         WHERE RN > ((currentPage-1) * pageSize) ) --当前页数 ORDER BY EMPNO DESC;

eg、-- 5 = (currentPage-1) * pageSize + pageSize   每页显示几条-- 0 = (currentPage-1) * pageSize              当前页数SELECT *  FROM EMP WHERE ROWID IN       (SELECT RID          FROM (SELECT ROWNUM RN, RID                  FROM (SELECT ROWID RID, EMPNO FROM EMP ORDER BY EMPNO DESC)                 WHERE ROWNUM <= ( (1-1) * 5 + 5 )) --每页显示几条         WHERE RN > ((1-1) * 5) ) --当前页数 ORDER BY EMPNO DESC;

方法二 按分析函数来分

SELECT *FROM (SELECT T.*, ROW_NUMBER() OVER(ORDER BY empno DESC) RK FROM emp T)WHERE RK <= ( (currentPage-1) * pageSize + pageSize ) --每页显示几条AND RK > ( (currentPage-1) * pageSize ); --当前页数

eg、-- 5 = (currentPage-1) * pageSize + pageSize   每页显示几条-- 0 = (currentPage-1) * pageSize              当前页数SELECT *FROM (SELECT T.*, ROW_NUMBER() OVER(ORDER BY empno DESC) RK FROM emp T)WHERE RK <= 5AND RK > 0;

方法三 按rownum 来分

SELECT *  FROM (SELECT T.*, ROWNUM RN          FROM (SELECT * FROM EMP ORDER BY EMPNO DESC) T         WHERE ROWNUM <= ( (currentPage-1) * pageSize + pageSize )) --每页显示几条 WHERE RN > ( (currentPage-1) * pageSize ); --当前页数

eg、-- 5 = (currentPage-1) * pageSize + pageSize   每页显示几条-- 0 = (currentPage-1) * pageSize              当前页数SELECT *  FROM (SELECT T.*, ROWNUM RN          FROM (SELECT * FROM EMP ORDER BY EMPNO DESC) T         WHERE ROWNUM <= 5) WHERE RN > 0;

其中emp为表名称,empno 为表的主键id,获取按empno降序排序后的第1-5条记录,emp表有70000 多条记录。
个人感觉方法一的效率最好,方法三 次之,方法二 最差。

下面通过方法三来分析oracle怎么通过rownum分页的

1、SELECT * FROM emp;2、显示rownum,由oracle分配的SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e; --rn相当于Oracle分配的行的ID号 3、先查出1-10条记录正确的: SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHERE ROWNUM<=10;错误的:SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHERE rn<=10;4、然后查出6-10条记录SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHERE ROWNUM<=10) WHERE rn>=6;
时间: 2024-11-05 01:59:18

八、oracle 分页的相关文章

oracle分页存储过程

oracle分页存储过程: CREATE OR REPLACE PROCEDURE FGK.prc_page (p_tableName in varchar2, --表名 p_strWhere in varchar2, --查询条件 p_orderColumn in varchar2, --排序的列 p_orderStyle in varchar2, --排序方式 p_curPage in out Number, --当前页 p_pageSize in out Number, --每页显示记录条

Oracle分页查询语句的写法(转)

分页查询是我们在使用数据库系统时经常要使用到的,下文对Oracle数据库系统中的分页查询语句作了详细的介绍,供您参考. Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用.Oracle分分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHER

ORACLE 分页查询

Oracle之分页查询 Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. 分页查询格式: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句.ROWNUM <= 40和RN >= 21控制分页查询的每页的范围.

oracle 分页查询数据重复问题

最近在做项目的时候发现一个问题,oracle 在查询分页数据的时候,有几条数据重复查询了,并且有几条数据在分页的时候消失了.百度了一下发现,ORACLE 在查询数据的时候返回的行不是固定的,他只是按照顺序从数据中读取符合条件的数据返回到客户端,给用户误解为默认排序. 然而,当我加上排序的时候,还是查询有重复的数据,(指第一页数据在第二页也查询出来了),这是我就疑问了,当我检查数据的时候,发现我排序的字段有空的情况,而且有很多条,导致排序返回的 伪列并不是唯一的. 总结: oracle 分页查询数

oracle分页查询结果集重复问题&解决方法

做项目时,无意间发现了分页上的一个bug,在此记录一下: 首先手动将后台输出的sql语句复制进oracle中查看,以便排查错误,对比以下视图前10条的结果集与10到20条的结果集,发现大部分记录出现重复现象,SQL语句如下: --前10条记录 select *   from (select row_.*, rownum rownum_           from (select t.idcard, count(1)                   from sampling.v_unvou

2.oracle分页,找到员工表中薪水大于本部门平均薪水的员工

 ROWNUM的知识点 A ROWNUM按照oracle的默认机制生成. B rownum只能使用<=  <号,不能使用>  >= rownum的实现机制 rownum表示,返回的结果集的行号(是一个属性,固化到一行之中,不会因为你排序,而发生变化).没有第一行,就没有第二行:没有第二行就没有第三行. Oracle Top-N select rownum,empno,ename,sal from (select empno,ename,sal from emp order by

Oracle分页在Web上的首页

本例子代码,只讲Oracle分页的常用的一种方法在Web中的使用,不涉及MVC,代码优化等东西,高手请飘过.新手可以参考. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

ORACLE分页SQL

1,使用rownum SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21 2,使用between SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A ) WHERE RN BETWEEN 21 AND 40 ORACLE分页SQL,布布扣,b

[Oracle]关于Oracle分页写法的性能分析及ROWNUM说明

关于分页写法的性能分析及ROWNUM的补充说明 分页写法 一.测试前数据准备 SQL> SELECT COUNT(*) FROM BPM_PROCVAR; COUNT(*) ---------- 2121400 1.分页写法一 SELECT * FROM (SELECT ROWNUM RN, A.* FROM (SELECT * FROM BPM_PROCVAR ORDER BY VARID) A WHERE ROWNUM <= 40) B WHERE B.RN >= 21; 查询结果:

MySQL oracle 分页

(1)MySql的Limit m,n语句 Limit后的两个参数中,参数m是起始下标,它从0开始:参数n是返回的记录数.我们需要分页的话指定这两个值即可. 比如:查询10行记录,起始行从3开始 SELECT * FROM emp LIMIT 3, 10; (2)Oracle数据库的rownum 子查询要包含在括号内. 将子查询放在比较条件的右侧. 单行操作符对应单行子查询,多行操作符对应多行子查询. 子查询可以出现在select,from,where,having子句中 子查询不可以出现在gro