在oracle中查找父节点(任何级别)的最多子节点

use*_*035 3 sql oracle oracle10g hierarchical-data

我的表结构是

 | Parent ID   |  ID         |
 |-------------|-------------|
 |      a      |     b       |
 |      b      |     c       |
 |      b      |     d       |
 |      b      |     e       |
 |      c      |     f       |
 |      d      |     g       |
 |      e      |     h       |
Run Code Online (Sandbox Code Playgroud)

我想获得所有父节点的最多子节点。在另一个表中我有 a 、 b 和 c 。然后我想得到下面的结果。

 |  Parent_ID  |  Child      |
 |-------------|-------------|
 |      a      |     f       |
 |      a      |     g       |
 |      a      |     h       |
 |      b      |     f       |
 |      b      |     g       |
 |      b      |     h       |
 |      c      |     f       |
Run Code Online (Sandbox Code Playgroud)

f、g、h 是最低粒度。

Sen*_*nel 5

我认为“大多数子节点”指的是树的叶节点。CONNECT_BY_ISLEAF您可以使用分层 ( ) 查询的伪列来确定叶节点CONNECT BY

给定表中的示例数据,以下查询将产生所需的结果:

select connect_by_root id id
     , parent_did
  from table1
 where connect_by_isleaf = 1
connect by id = prior parent_did
  start with id in ('a','b','c');

| ID | PARENT_DID |
|----|------------|
|  a |          f |
|  a |          g |
|  a |          h |
|  b |          f |
|  b |          g |
|  b |          h |
|  c |          f |
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

考虑您更新的数据和要求,包括第二个表将 a、b 和 c 作为开始条件:

select connect_by_root parent_id parent_id
     , id
  from table1
 where connect_by_isleaf = 1
connect by prior id = parent_id
  start with parent_id in (select id from table2)

| PARENT_ID | ID |
|-----------|----|
|         a |  f |
|         a |  g |
|         a |  h |
|         b |  f |
|         b |  g |
|         b |  h |
|         c |  f |
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle 您可以从文档中了解有关分层查询的更多信息。