在一个项目中,我们成功地实现了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