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

标签 sql oracle oracle10g hierarchical-data

我的表结构是

 | Parent ID   |  ID         |
 |-------------|-------------|
 |      a      |     b       |
 |      b      |     c       |
 |      b      |     d       |
 |      b      |     e       |
 |      c      |     f       |
 |      d      |     g       |
 |      e      |     h       |

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

 |  Parent_ID  |  Child      |
 |-------------|-------------|
 |      a      |     f       |
 |      a      |     g       |
 |      a      |     h       |
 |      b      |     f       |
 |      b      |     g       |
 |      b      |     h       |
 |      c      |     f       |

f、g、h 是最低粒度的。

最佳答案

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

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

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 |

SQL Fiddle

考虑到您更新的数据和要求,包括第二个表将 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 |

SQL Fiddle 您可以从 documentation 了解有关分层查询的更多信息.

关于sql - 在oracle中查找父(任意级别)的最多子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34348681/

相关文章:

c# - 带有 IN 语句的 Oracle 参数?

sql - 遍历行以与sql中的ascii值进行比较?

java - 从 mysql 表读取时出错

mysql - SELECT 用户订阅的多个值的总和

mysql - 计算一个词每天被使用多少次

mysql - 如何对两个表进行并行连接并按创建日期对结果进行排序?

oracle - 需要使用 sql developer 在 oracle db 上按日期计算记录和组计数

python - cx_Oracle 无法识别用于在 Linux 上安装的 Oracle 软件安装位置

oracle - PL/SQL : ORA-00932: inconsistent datatypes: expected UDT got NUMBER

python - 使用 cx_Oracle 从存储过程中捕获 stdout 输出