从oracle sql表获取祖先

时间:2013-01-31 17:05:27

标签: sql oracle

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

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中完成?

没有存储过程可以完成吗?

与往常一样,谢谢你的高级时间。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

Wikipedia on the Nested Set Model
Joe Celko's Explanation (excellent)