1

我有一个具有以下结构的表:

CHILD_ID | PARENT_ID

两列都是整数。

我正在尝试获取给定“节点”的所有祖先。我有最高的 id,我想选择一个包含所有孩子的 id 的表。

CHILD_ID | PARENT_ID
1          2
6          12
2          3
3          4
9          82

寻找祖先为4

应该返回

ID
3
2
1

这将如何在 oracle 中完成?

可以在没有存储过程的情况下完成吗?

与往常一样,感谢您抽出宝贵的时间。

4

2 回答 2

4

为了满足您的输出期望,查询可能是这样的:

-- sample of data
SQL> with t1(CHILD_ID, PARENT_ID) as(
  2    select 1,  2  from dual union all
  3    select 6,  12 from dual union all
  4    select 2,  3  from dual union all
  5    select 3,  4  from dual union all
  6    select 9,  82 from dual
  7  ) -- actual query
  8  select child_id
  9    from t1
 10  start with parent_id = 4
 11  connect by parent_id = prior child_id
 12  ;

  CHILD_ID
----------
         3
         2
         1
于 2013-01-31T17:12:58.000 回答
0

最好的解决方案是做邻接树或嵌套集合树。然后,您可以执行从单个查询返回子树的超快速操作。最糟糕的解决方案是使用游标并逐步浏览记录并尝试通过每个记录的父母进行递归。

嵌套的集合树非常棒,唯一的缺点是它们在更改时需要重新编号。但是,如果您需要计算聚合,例如,它们的速度完全是香蕉。

嵌套集模型上的维基百科
Joe Celko 的解释(优秀)

于 2013-01-31T17:09:45.550 回答