在 Oracle 数据库中实现分页查询有几种常见方法,以下是主要的实现方式:
-- 第一页,每页10条
SELECT *
FROM (
SELECT a.*, ROWNUM rn
FROM (
SELECT * FROM your_table
ORDER BY some_column -- 必须有排序
) a
WHERE ROWNUM <= 10 -- 页大小 × 页码
)
WHERE rn > 0; -- 页大小 × (页码-1)
-- 第二页示例
SELECT *
FROM (
SELECT a.*, ROWNUM rn
FROM (
SELECT * FROM your_table
ORDER BY some_column
) a
WHERE ROWNUM <= 20
)
WHERE rn > 10;
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER (ORDER BY some_column) AS rn
FROM your_table t
)
WHERE rn BETWEEN 11 AND 20; -- 第二页,每页10条
-- 第一页,每页10条
SELECT * FROM your_table
ORDER BY some_column
OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
-- 第二页
SELECT * FROM your_table
ORDER BY some_column
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
SELECT *
FROM (
SELECT t.*,
DENSE_RANK() OVER (ORDER BY some_column) AS rnk
FROM your_table t
)
WHERE rnk BETWEEN 11 AND 20;
-- 使用绑定变量
SELECT *
FROM (
SELECT a.*, ROWNUM rn
FROM (
SELECT * FROM your_table
ORDER BY :sort_column :sort_direction
) a
WHERE ROWNUM <= :page_size * :page_number
)
WHERE rn > :page_size * (:page_number - 1);
选择哪种方法取决于您的 Oracle 版本和具体需求,Oracle 12c 及以上版本推荐使用 OFFSET-FETCH 语法,它更简洁且性能良好。