以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
需要排序时建议使用此方式。