Oracle:如何在树中查找

时间:2013-10-16 16:46:14

标签: oracle

抱歉我的英文。

Category

ID
PID
name

层次结构:

  • 第1类
    • 第2类
      • 第3类
        • 第4类
        • 第5类
    • 第3类
      • 第7类
      • 第8类

可以重复类别名称。如何根据要求找到所有孩子:oracle的“2类和3类”?

结果应为:

  • 第2类
    • 第3类
      • 第4类
      • 第5类

==已更新==

我需要找到名字“类别2和类别3”,因为类别名称可能会重复!

1 个答案:

答案 0 :(得分:0)

有几个假设。 PID是当前记录的父ID,您知道类别2的ID。

在本例中,我将使用245作为类别2的id。如果您无法获得起始类别的唯一ID,那么这是一个不同的问题,必须在您的数据中解决。

(我在昨天做了一个自下而上的查询给出了另一个问题的类似答案。自下而上和自上而下的区别是先前语句连接中col1 = col2的顺序。)

使用hierarchical query

select  Lpad(Name,Length(Name) + LEVEL * 10 - 10,'-') Name 
  from Category
 start with id = 245
connect by prior id = pid;

这是sqlFiddle

============编辑==============

现在添加了这个,我更清楚你需要什么。

select  Lpad(Name,Length(c1.Name) + LEVEL * 10 - 10,'-') Name 
  from Category c1
 start with c1.name = 'Category 2'
        and c1.id in (select c2.pid from category c2 where c2.name = 'Category 3')
connect by prior c1.id = c1.pid;

这将为您提供从类别2开始的所有分支,其中第3类作为下一个孩子。

我添加了另一个sqlFiddle,其中一个额外的分支具有2/5关系,因此您可以看到它只返回两个2/3分支。