oracle sql 分页总页数或总条目数

v1s*_*hnu 1 oracle pagination

我正在尝试从数据库访问分页结果。按照以下查询:

SELECT * FROM
(
    SELECT a.*, rownum r__
    FROM
    (
        SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%'
        ORDER BY OrderDate DESC, ShippingDate DESC
    ) a
    WHERE rownum < ((pageNumber * pageSize) + 1 )
)
WHERE r__ >= (((pageNumber-1) * pageSize) + 1)
Run Code Online (Sandbox Code Playgroud)

这里,我能够实现分页。

我修改了如下查询,以便也获得总计数:

SELECT * FROM
(
    SELECT a.*, rownum r__ , count(OrderDate)
    FROM
    (
        SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%'
        ORDER BY OrderDate DESC, ShippingDate DESC
    ) a    group by OrderDate
) 
WHERE r__ between (pageNumber * pageSize )+ 1 and (pageNumber *pageSize) + pageSize;
Run Code Online (Sandbox Code Playgroud)

但我还想计算总页数以及请求的页面是否也是最后一页。我试图获取COUNT内部查询的 ,以便我可以计算代码中的总页数,但我无法获取它。我已经尝试过COUNT(ORDERDATE)并分组,但它不起作用。

请告诉我如何才能实现这一目标。

Bon*_*ist 5

我会使用分析函数来完成您想要做的工作,例如:

SELECT res.*,
       CEIL(total_num_rows/pagesize) total_num_pages
FROM   (SELECT o.*,
               row_number() OVER (ORDER BY orderdate DESC, shippingdate DESC) rn,
               COUNT(*) OVER () total_num_rows
        FROM   orders o
        WHERE  customerid LIKE 'A%') res
WHERE  rn BETWEEN (pagenumber - 1) * pagesize + 1 AND pagenumber * pagesize;
Run Code Online (Sandbox Code Playgroud)

注意:未经测试。

该查询通过使用 row_number() 分析函数在指定的组中并按指定的顺序为每行分配一个编号来进行分页。由于我们在 OVER 部分中没有 partition by 子句,因此该函数适用于整个行集。

类似地,我们使用 count() 分析函数来获取指定组中的行数 - 而且,由于我们没有指定任何partition by 子句,因此该函数适用于整个行集。

现在您有了这些数字,进行分页并查找总页数就很简单了。