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

时间:2017-07-21 14:08:41

标签: oracle pagination

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

alert('Hello World')

来自here,我能够实现分页。

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

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)

但我也想计算总页数,以及所请求的页面是否也是最后一页。我试图获取内部查询的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; ,以便我可以计算代码中的总页数,但我无法得到它。我试过COUNT并进行分组,但它不起作用。

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

2 个答案:

答案 0 :(得分:3)

我会使用分析函数来完成您正在尝试的工作,例如:

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;

N.B。未经测试。

查询通过使用row_number()分析函数为每行,跨指定组和指定顺序分配编号来执行分页。由于我们在OVER部分中没有分区by子句,因此该函数在整个行集中都有效。

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

现在你有了这些数字,进行分页并查找总页数是一件简单的事情。

答案 1 :(得分:2)

如果您使用的是Oracle 12.1或更高版本,则会变得更简单:

select o.*
     , 'Page ' || pagenumber || ' of ' || ceil(count(*) over () / pagesize) as pagecount
from   orders o
where  customerid like 'T%'
order by orderdate desc, shippingdate desc
offset (pagenumber -1) * pagesize rows fetch next pagesize rows only;

page count列会报告Page 2 of 34等值。