这是我想要实现的伪代码
part1 = select from foo ...
part2 = init empty
foreach row in part1
part2 += select from foo where row.something as condition in here
union part1, part2
Run Code Online (Sandbox Code Playgroud)
是否可以在一个查询中执行此操作?
这是结构
parent_name | name
------------+-------
null | item1 # root
item1 | item2 # first level
item1 | item3 # first level
item2 | item4 # second level
item4 | item5 # third level
null | item6 # another root
Run Code Online (Sandbox Code Playgroud)
结果 - 条件是我只想要root name = item1的树
parent_name | name
------------+-------
null | item1
item1 | item2
item1 | item3
item2 | item4
Run Code Online (Sandbox Code Playgroud)
基本上它是一个树结构,我希望得到树中的所有行(两层深),从根开始.结果中缺少Item5,因为它在第三级和item6中,因为它是不同的树.
看起来你是在分层查询之后:
with sample_data as (select null parent_name, 'item1' name from dual union all
select 'item1' parent_name, 'item2' name from dual union all
select 'item1' parent_name, 'item3' name from dual union all
select 'item2' parent_name, 'item4' name from dual union all
select 'item4' parent_name, 'item5' name from dual union all
select null parent_name, 'item6' name from dual)
select parent_name,
name
from (select parent_name,
name,
level lvl,
max(level) over (partition by connect_by_root(name)) max_lvl
from sample_data sd
connect by prior name = parent_name
and level <= 3
start with parent_name is null)
where max_lvl > 1;
PARENT_NAME NAME
----------- -----
item1
item1 item2
item2 item4
item1 item3
Run Code Online (Sandbox Code Playgroud)
NB我不完全确定为什么你不想在结果中看到item6,所以我认为这是因为它没有任何子行.
这就是为什么我生成了"max_lvl"列,它只是找到该特定分支的最深层,然后添加外部查询来过滤掉只有顶层的分支.
如果情况并非如此,那么你必须更加具体地说明为什么你不希望它出现在结果中.