【问题标题】:How can I find the highest parent level or field in Oracle?如何在 Oracle 中找到最高父级别或字段?
【发布时间】:2014-11-28 21:52:50
【问题描述】:

我有一个名为“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

但我想要该层次结构中的所有子/父,而不管给定的任何值..即如果我给“80”....,我必须获取最高父值(在本例中为“1”),然后搜索下面那个最高父值的所有子值。

【问题讨论】:

  • 我很难理解您的需求。您是否在寻找“所有孩子都有共同的祖先”
  • 是什么让1 成为80 的“最高父值”?是不是因为它实际上是升序列表中的最小值?
  • @Caffé 据我了解,180 的终极祖先:80 => 121 => 101 => 1。但不清楚之后应该做什么。找到1 的所有后代?还是只有它的“直接”孩子?
  • 是的,1.... 的所有后代 ..首先要找到 1,然后得到 1 的所有子代,即 1 --> 101, 102,103,然后是 101 -> 121,123和 103-->133 和 121-->80,81。不确定,如果这可能......如果给定任何与之关联的值,则获取整个层次结构。

标签: sql oracle recursion parent-child highest


【解决方案1】:

您可以使用递归查询和伪列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

一旦你有了“终极祖先”,第二个递归查询就会得到那个节点的所有后代:

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

请注意LEVEL 伪列,它可以让您知道节点与其最终祖先之间的“距离”。

把它们放在一起:

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

【讨论】:

  • 感谢您的回答。它符合我的目的。
  • 我研究发现Teradata中没有Connect By子句。如果我们想在 Teradata 中做同样的事情,我应该如何解决同样的问题?使用递归因子查询......我该怎么做?
  • @Anitha 这值得另一个问题。这样你就可以从真正了解teradata的人那里得到答案。
  • 当然……知道了。将尝试发布另一个。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多