Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 甲骨文:如何在树中找到_Oracle - Fatal编程技术网

Oracle 甲骨文:如何在树中找到

Oracle 甲骨文:如何在树中找到,oracle,Oracle,对不起我的英语 是表类别: ID PID name 和层次结构: 第一类 第2类 第3类 第4类 第5类 第3类 类别7 第8类 类别名称可以重复。如何根据请求查找所有子项:“类别2和类别3”适用于oracle 结果应该是: 第2类 第3类 第4类 第5类 ==更新== 我需要按名称查找“类别2和类别3”,因为类别名称可能会重复 一些假设。PID是当前记录的父id,您知道类别2的id 在本例中,我将使用245作为类别2的id。如果您无法获得起始类别的唯一id,那

对不起我的英语

是表
类别

ID
PID
name
和层次结构:

  • 第一类
    • 第2类
      • 第3类
        • 第4类
        • 第5类
    • 第3类
      • 类别7
      • 第8类
类别名称可以重复。如何根据请求查找所有子项:“类别2和类别3”适用于oracle

结果应该是:

  • 第2类
    • 第3类
      • 第4类
      • 第5类
==更新==


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

一些假设。PID是当前记录的父id,您知道类别2的id

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

(我昨天做了一个自下而上的查询,对另一个问题给出了类似的答案。自下而上和自上而下之间的区别是connect by PREVIOR语句中col1=col2的顺序。)

使用一个

这是一个例子

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

现在我更清楚你需要什么了,我补充了这一点

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关系的附加分支,因此您可以看到它只返回两个2/3分支。

CONNECT BY Previor,但我不知道如何在树状分支中查找类别2和类别3。这实际上与树状分支无关。将数据视为一张平面表格,然后尝试选择一个特定的“类别3”。如果你所拥有的只是你将无法找到的名称。我需要按名称查找“类别2和类别3”,但不是按ID查找。根据你上面所说的,“类别2和类别3”不是唯一的。使用名称运行的任何查询都将返回所有匹配项。例如,如果类别1(遵循上述模式)有一个同级节点,则该节点将命名为类别2,并且该节点将有一个类别3的子节点。所以你可以在一个查询中得到这两个集合。我需要找到“类别3”的所有节点,它有一个父节点“类别2”。我可以在
SYS\u CONNECT\u BY\u PATH()
中使用搜索找到此节点,但这是一个错误的决定。您的上述数据是固定的和永久的吗?这意味着这是实际的生产数据,它永远不会改变。
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;