Oracle_ ROW_NUMBER用于分页层次结构查询

时间:2017-03-10 08:13:05

标签: sql oracle hierarchy row-number

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

  

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

现在我指望row_number的 rownum 进行分页。作为Oracle层次结构查询的doc,这确保我可以将树显示为预订Traveral,这是我们想要的,但作为SQL一般来说,IMO并不保证相同 - 级别节点将被排序(或不是?)。

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

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分: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子句,然后在执行外部查询时生成行号。