sql - 检索层次结构的上升行

标签 sql oracle connect-by

我有一个包含 3 列的示例表:idparent_idname

假设我的表中存在的层次结构如下:

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

关于sql - 检索层次结构的上升行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48266059/

相关文章:

php - 如果未更新则插入 MySQL

sql - Left Join 子查询的前 1 位

oracle - 如何从服务器确定正在使用哪个版本的 Oracle Client

sql - 在 oracle 树查询中加入其他表

sql - 为什么确定性函数在 CONNECT BY LEVEL 查询中返回意外数字?

mysql - 如果条件匹配,如何循环遍历 MySQL 表中的每一行并获取行

sql - 如何从 PostgreSQL 子查询返回两个值?

java - 索引和分页

mysql - 如何将 Oracle 数据库转换为 MySQL?

sql - 通过根据两个(起始和终止)值计算非中断时间段进行分组