-1

对不起我的英语不好。

是表Category

ID
PID
name

和层次结构:

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

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

结果应该是:

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

== 更新 ==

我需要按名称“Category 2 AND Category 3”查找,因为类别名称可能会重复!

4

1 回答 1

0

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

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

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

使用分层查询

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 作为下一个子项。

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

于 2013-10-16T17:01:30.620 回答