【问题标题】:Oracle hierarchical query join to selection of all decendantsOracle分层查询连接到所有后代的选择
【发布时间】:2016-01-04 04:35:50
【问题描述】:

我正在尝试检索每个项目的每个后代的列表。 我不确定我是否有道理,我会尝试解释。

示例数据:

ID | PID
--------
1  | 0
2  | 1
3  | 1
4  | 1
5  | 2
6  | 2
7  | 5
8  | 3

等等……

期望的结果是:

ID | Decendant
--------------
1  | 1
1  | 2
1  | 3
1  | 4
...
2  | 2
2  | 5
2  | 6
2  | 7
3  | 3
3  | 8

等等……

目前这是通过使用光标在数据中移动并将每个后代插入表中然后从中进行选择来实现的。

我想知道是否有更好的方法来执行这些操作,必须有一种方法来纠正可以返回所需结果的查询。

如果有人有想法,或者在此之前已经想通了,将不胜感激。排序并不重要,1 - 1、2 -2 参考也不重要。拥有它会很酷,但并不重要。

【问题讨论】:

  • 你确定吗? 1-4有效吗?使用此处显示的示例数据。抱歉,我对 PID 列感到困惑!
  • PID 是 Parent ID,也许我应该指定,所以 Parent ID 4 是 1。所以 4 是 1 的后代,所以 1 - 4 是有效的。
  • @OracleUser,如果您认为我的问题令人困惑,我可以尝试改写它,但我不确定如何
  • 我想我明白了!此外,似乎每个 id 都是其自身的后代。
  • 我希望它在结果中以这种方式显示,但这不是必需的,如果不是,我可以轻松解决它。

标签: oracle hierarchical


【解决方案1】:
select connect_by_root(id) as ID, id as Decendant
from table1
connect by prior id = pid
order by 1, 2

fiddle

【讨论】:

  • 确实有效,非常感谢。我猜它与connect_by_root()有关?我会查一下,这不是我以前遇到过的东西。我之前有用户连接,但仅限于“更扁平”的列表。
【解决方案2】:

这是我的尝试!不确定,如果我没听错!

select pid ,connect_By_root(id) as descendant from process
connect by  id = prior pid
union all
select distinct pid,pid from
process
order by pid,descendant

【讨论】:

  • 这正是我一直在寻找的,令人惊讶的是,一些 Oracle 查询竟然如此简单。
  • @JonathanPeel Cool.. 上半部分标识一个父代.. 并跟踪它的所有子代.. 下半部分是您的附加要求,将父代映射到父代本身!
  • 我确实理解了第二部分,以及它为什么在那里。我以前用过connect by,但从来没有遇到过connect_by_root(),谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-04-12
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多