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