ORACLE查询结果分页

以ORACLE 10g来说,常用的分页方式有两种:

 

1、使用ROW_NUM关键字。对每一个查询结果此关键字返回一个数值型的伪列,此伪列标识了查询结果中每一行的顺序。毫无疑问,这正是我们分页时需要的,此关键字的使用方式如下:

SELECT ROWNUM, A.* FROM TableX A
 

如果我们需要分页,那么先在程序中计算出需要的行数范围。例如每页显示10行,现在浏览第2页,就是要查询11行至20行的内容,那么只需见做一个子查询就OK,如下:

SELECT * FROM
(
  SELECT ROWNUM AS RN, A.* FROM TableX A
)
WHERE RN BETWEEN 10 AND 20
 

使用此方式分页有个局限性。如果当需要对结果进行排序,然后按新的顺序分页显示时就不方便。

比如如下的方式就不可行:

SELECT * FROM
(
  SELECT ROWNUM AS RN, A.* FROM TableX A
  WHERE ORDER BY COL1,COL2,COL3
)
WHERE RN BETWEEN 10 AND 20
 

因为此方式会先将行的序号列出来后,再对结果排序,这样在新的结果集中行序号顺序就是混乱的。对于此种情况我们需要多来几个子查询,如下:

SELECT * FROM
(
  SELECT ROWNUM AS RN,A.* FROM
  (
    SELECT * FROM TableX
    ORDER BY COL1,COL2,COL3
  ) A
)
WHERE RN BETWEEN 10 AND 20

 

显然这种方式嵌套查询太多。如果需要排序的话,建议采用下面的第二种方式。

 

2、使用ROW_NUMBER()函数。此函数提供了一个排序的方法,使用方法如下:

SELECT ROW_NUMBER() OVER (ORDER BY COL1,COL2,COL3) AS RN, A.*
FROM TableX A
 

完整的分页语句如下:

SELECT * FROM
(
  SELECT ROW_NUMBER() OVER (ORDER BY COL1,COL2,COL3) AS RN, A.*
  FROM TableX A
)
WHERE RN BETWEEN 10 AND 20
 

需要排序时建议使用此方式。

 

转载请注明出处:http://wangfeizy.iteye.com/blog/1725992

你可能感兴趣的:(oracle,排序,分页)