【问题标题】:oracle sql pagination with total pages or total entriesoracle sql分页与总页数或总条目
【发布时间】:2017-07-21 14:08:40
【问题描述】:

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

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)

来自here,我可以实现分页。

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

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,以便我可以计算代码中的总页数,但我无法得到它。我试过 COUNT(ORDERDATE) 和分组,但它不起作用。

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

【问题讨论】:

    标签: oracle pagination


    【解决方案1】:

    我会使用分析函数来做你想做的工作,例如:

    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;
    

    注意未经测试。

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

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

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

    【讨论】:

    • 太棒了!这按预期工作,也给了我总页数。非常感谢:)
    【解决方案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 这样的值。

    【讨论】:

    • 不幸的是,我们仍在使用旧版本。希望这可能对与该版本有相同要求的人有用。
    猜你喜欢
    • 2018-02-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2018-03-21
    • 2018-02-16
    相关资源
    最近更新 更多