【问题标题】:Oracle_ ROW_NUMBER for paging hierarchy queryOracle_ROW_NUMBER 用于分页层次结构查询
【发布时间】:2017-03-10 08:13:04
【问题描述】:

这次我遇到的问题是层次表的分页查询。

table_name(id varchar2(50), id_parent varchar2(50));

所以对于我有的示例数据:

WITH table_name AS
(
    SELECT '3' id, '' id_parent FROM DUAL UNION ALL
    SELECT '5' id, '3' id_parent FROM DUAL UNION ALL
    SELECT 's' id, '3' id_parent FROM DUAL UNION ALL
    SELECT '4' id, 'as' id_parent FROM DUAL UNION ALL
    SELECT 'aa' id, 'as' id_parent FROM DUAL UNION ALL
    SELECT 'as' id, '3' id_parent FROM DUAL UNION ALL
    SELECT 'ad' id, '3' id_parent FROM DUAL UNION ALL
    SELECT '2' id, '' id_parent FROM DUAL 
)
SELECT LPAD('-', 2 * (level - 1), '-') || id AS id1,
    id_parent, 
    rownum  --Seem not legit here
FROM table_name
START WITH id_parent IS NULL
CONNECT BY PRIOR id = id_parent 
--ORDER SIBLINGS BY id
;

这是预期的输出:

id          id_parent   rownum
2                       1
3                       2
--5         3           3
--ad        3           4
--as        3           5
----4       as          6
----aa      as          7
--s         3           8

现在我依靠 rownum 为 row_number 进行分页。作为 Oracle 层次结构查询的文档,这确保我可以将树显示为我们想要的预购 Traveral,但作为一般的 SQL,IMO 不保证对同级节点进行排序(或不排序? )。

所以我需要像ROW_NUMBER() OVER (ORDER SIBLINGS BY id) 这样的东西。但我没能找到类似的东西。

有什么方法可以解决这个问题吗?

【问题讨论】:

    标签: sql oracle hierarchy row-number


    【解决方案1】:

    先排序,然后使用子查询生成ROWNUM

    SELECT t.*,
           ROWNUM
    FROM   (
      SELECT LPAD('-', 2 * (level - 1), '-') || id AS id1,
          id_parent
      FROM table_name
      START WITH id_parent IS NULL
      CONNECT BY PRIOR id = id_parent 
      ORDER SIBLINGS BY id
    ) t;
    

    您需要外部查询,因为查询中执行的顺序是:

    • 行被选中;
    • 然后应用WHERE 子句过滤器(ROWNUM 伪列是 为匹配所有 WHERE 子句过滤器的每一行生成 - 在这种情况下,没有 WHERE 子句,因此所有行都将被编号);
    • 然后应用ORDER BY 子句。

    在单个查询中应用它会得到在数据库中找到的行,然后给它们一个行号,最后对这些行进行排序(不是你想要的)。使用内部查询,您可以强制首先应用 ORDER BY 子句,然后在执行外部查询时生成行号。

    【讨论】:

    • arr,谢谢 MTO,这是我在rownum 中缺乏的知识。阅读您的答案后,我也搜索并发现了这个有用的链接On Top-n and Pagination Queries(尽管我之前在 asktom "__" 的某个地方读过一次,
    猜你喜欢
    • 1970-01-01
    • 2015-06-25
    • 2019-05-02
    • 2020-04-17
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2012-08-03
    相关资源
    最近更新 更多