如何在Oracle中找到最高的父级别或字段?

时间:2014-10-03 19:44:22

标签: sql oracle recursion parent-child highest

我有一张名为" test"的表。它包含父列和子列。

Parent  Child
  1      101
  1      102
  1      103
 101     121
 101     123
 103     133
 121     80
 121     81

现在,我写了一个查询,它给我带来了给定的所有孩子/父母" 1"值。

( SELECT parent,child,LEVEL FROM TEST
    START WITH child= 1
    CONNECT BY PRIOR parent=child) 
UNION ALL
   (SELECT parent,child,LEVEL FROM TEST
      START WITH parent=1
      CONNECT BY PRIOR child=parent)
      ORDER BY parent

但是我想要那个等级中的所有孩子/父母,无论给出什么价值......。如果我给#34; 80" ....,我必须获取最高的父母价值(在这种情况下" 1")然后搜索下面那个最高父母值的所有孩子。

1 个答案:

答案 0 :(得分:2)

您可以使用递归查询和伪列CONNECT_BY_ISLEAF来查找节点的最终祖先:

SELECT parent AS ancestor 
  FROM X 
  WHERE CONNECT_BY_ISLEAF <> 0
  START WITH child=80 
  CONNECT BY PRIOR parent=child
--           ^^^^^^^^^^^^^^^^^^
--             ascendant order

一旦你拥有了#34;终极祖先&#34;,第二个递归查询将获得该节点的所有后代:

SELECT child AS descendant, LEVEL
  FROM X
  START WITH parent=1 
  CONNECT BY PRIOR child=parent
--           ^^^^^^^^^^^^^^^^^^
--            descendant order

请注意LEVEL伪列,让您了解&#34;距离&#34;在一个节点和它的最终祖先之间。

全部放在一起:

SELECT child AS descendant, LEVEL
  FROM X
  START WITH parent IN (

    SELECT parent AS ancestor
      FROM X 
      WHERE CONNECT_BY_ISLEAF <> 0
      START WITH child=80 
      CONNECT BY PRIOR parent=child

  ) 
  CONNECT BY PRIOR child=parent

根据您的样本数据制作:

DESCENDANT  LEVEL
101         1
121         2
80          3
81          3
123         2
102         1
103         1
133         2