如何以SQL标准的通用方式实施分页机制



在一个项目中,我们成功地实现了SQL Server的分页机制,但是根据我们的要求,我们正在尝试以通用方式实现oracle,sql Server,db2的分页机制&DB400数据库。是否可以以这种方式实施分页?实现此类查询的最简单通用方法是什么?

据我所知,没有通用功能可以实现所有数据库的小屋机制。

实现分页的语法也可能随数据库而变化,因此很难说在所有数据库中实现它。

您可以参考仅使用ANSI SQL进行分页的方法吗?接受的答案是指一个链接,该链接说要使用它,例如

SELECT * FROM (
  SELECT
    ROW_NUMBER() OVER (ORDER BY key ASC) AS rownum,
    columns
  FROM tablename
) AS foo
WHERE rownum > skip AND rownum <= (n+skip)

在Oracle中,有多种方法:

  • ROWNUM 在subquery和 在外部查询中
  • 分析 row_number()
  • top-n行限制子句在新的Oracle 12c

使用 ROWNUM:

SQL> WITH DATA AS(
  2  SELECT level col
  3  FROM   dual
  4  CONNECT BY LEVEL <= 10
  5  )
  6  SELECT col
  7  FROM   (SELECT col, rownum AS rnum
  8          FROM   (SELECT col
  9                  FROM   data
 10                  ORDER BY col)
 11          WHERE rownum <= 8)
 12  WHERE  rnum >= 5;
       COL
----------
         5
         6
         7
         8

使用分析 row_number()

SQL> WITH DATA AS(
  2  SELECT level col
  3  FROM   dual
  4  CONNECT BY LEVEL <= 10
  5  )
  6  SELECT * FROM (
  7    SELECT
  8      ROW_NUMBER() OVER (ORDER BY col) rn
  9    FROM DATA
 10  )
 11  WHERE rn >= 5 AND rn <= 8;
        RN
----------
         5
         6
         7
         8

使用 top-n行限制子句

SQL> WITH DATA AS(
  2  SELECT level col
  3  FROM   dual
  4  CONNECT BY LEVEL <= 10
  5  )
  6  SELECT col
  7  FROM   DATA
  8  ORDER BY col
  9  OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY;
       COL
----------
         5
         6
         7
         8

我了解的内容。尝试以下操作:

WITH MyCte AS 
(
    SELECT row_number() OVER (ORDER BY FieldName) ID, *  FROM TableName
)
SELECT  *
FROM    MyCte
WHERE   ID BETWEEN 1 AND 10

最新更新