如何使用选择结果作为第二个选择的输入(如foreach)?

use*_*882 1 sql oracle

这是我想要实现的伪代码

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中,因为它是不同的树.

Bon*_*ist 6

看起来你是在分层查询之后:

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"列,它只是找到该特定分支的最深层,然后添加外部查询来过滤掉只有顶层的分支.

如果情况并非如此,那么你必须更加具体地说明为什么你不希望它出现在结果中.