检索层次结构的上升行
Retrieve ascendant rows of a hierarchy
我有一个包含 3 列的示例 table:id
、parent_id
和 name
假设我的 table 中存在的层次结构如下:
I
I.A
I.A.a
I.A.b
I.A.b1
I.A.b2
I.B
I.C
II
II.A
我的目标是检索给定行的所有上级。例如,对于 I.A.b2
,结果将是:
I
I.A
I.A.b
I.A.b2
我尝试使用以下 connect-by
查询但没有成功:
SELECT name
FROM test
where id = 7 -- 7 is the id of I.A.b2 in my example
CONNECT BY PRIOR id = parent_id
START WITH parent_id is null;
任何建议都会有所帮助
诀窍是以相反的顺序(从末尾开始)遍历记录,然后使用 order by
反转顺序,如下所示:
SELECT name
FROM test
CONNECT BY PRIOR parent_id = id
START WITH id = 7
ORDER BY rownum DESC
要获取树中每条记录的级别,您可以使用 row_number()
分析函数:
SELECT ROW_NUMBER() OVER (ORDER BY rownum DESC), name
FROM test
CONNECT BY PRIOR parent_id = id
START WITH id = 7
ORDER BY rownum DESC
我有一个包含 3 列的示例 table:id
、parent_id
和 name
假设我的 table 中存在的层次结构如下:
I
I.A
I.A.a
I.A.b
I.A.b1
I.A.b2
I.B
I.C
II
II.A
我的目标是检索给定行的所有上级。例如,对于 I.A.b2
,结果将是:
I
I.A
I.A.b
I.A.b2
我尝试使用以下 connect-by
查询但没有成功:
SELECT name
FROM test
where id = 7 -- 7 is the id of I.A.b2 in my example
CONNECT BY PRIOR id = parent_id
START WITH parent_id is null;
任何建议都会有所帮助
诀窍是以相反的顺序(从末尾开始)遍历记录,然后使用 order by
反转顺序,如下所示:
SELECT name
FROM test
CONNECT BY PRIOR parent_id = id
START WITH id = 7
ORDER BY rownum DESC
要获取树中每条记录的级别,您可以使用 row_number()
分析函数:
SELECT ROW_NUMBER() OVER (ORDER BY rownum DESC), name
FROM test
CONNECT BY PRIOR parent_id = id
START WITH id = 7
ORDER BY rownum DESC