这次我遇到的问题是层次结构表的分页查询。
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)
这样的东西。但我没有找到类似的东西。
有没有办法解决这个问题?
答案 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
子句,然后在执行外部查询时生成行号。