2015-10-01 32 views
1

这里是我想达到的目标,在伪如何使用选择结果作为第二选择的输入(如foreach)?

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 

是否有可能做一个查询?

这是结构

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 

而结果 - 与条件,我只希望棵树,根名称=物品1

parent_name | name 
------------+------- 
null  | item1 
item1  | item2 
item1  | item3 
item2  | item4 

基本上这是一个树状结构,我想所有的行从树根开始(深入两层)。 Item5在结果中缺失,因为它在第三层和item6中,因为它是不同的树。

+1

是的,它被称为**相关子查询** – lad2025

+1

编辑你的问题,并提供样本数据和预期的结果。 –

+0

也许你刚刚加入,而不是相关的子查询?没有戈登要求的信息,很难猜出你的意思。 – Boneist

回答

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 

注:我不完全确定你为什么不想在结果中看到item6,所以我认为这是因为它没有任何子行。

这就是为什么我生成了“max_lvl”列,它只是找到该特定分支的最深层次,然后添加外部查询以筛选出仅具有最高级别的分支。

如果情况并非如此,那么您在逻辑背后的逻辑必须更加具体,以便您不需要结果。

+0

因为'我只想要树根名字= item1',所以OP不想'item6'。如果您使用START WITH name ='item1',那么您可以简化您的查询。 – MT0

+0

是的,是的;它不是立即清楚为什么OP只想要item1,因此我的查询 – Boneist

1

您可以使用分层查询:

SELECT parent_name, NAME 
FROM table1 
WHERE LEVEL <= 3 
CONNECT BY PRIOR NAME = parent_name 
START WITH parent_name IS NULL; 
ORDER BY 1 NULLS FIRST; 

对我来说,目前尚不清楚为什么你不想“ITEM6”中显示,这是不符合逻辑的我。无论如何,你这个实现它:

SELECT parent_name, NAME 
FROM table1 
WHERE LEVEL <= 3 
CONNECT BY PRIOR NAME = parent_name 
START WITH NAME = 'item1' 
ORDER BY 1 NULLS FIRST; 
1

SQL Fiddle

的Oracle 11g R2架构设置

CREATE TABLE test (parent_name, name) AS 
      SELECT NULL, 'item1' FROM DUAL 
UNION ALL SELECT 'item1', 'item2' FROM DUAL 
UNION ALL SELECT 'item1', 'item3' FROM DUAL 
UNION ALL SELECT 'item2', 'item4' FROM DUAL 
UNION ALL SELECT 'item4', 'item5' FROM DUAL 
UNION ALL SELECT NULL, 'item6' FROM DUAL; 

查询1

SELECT * 
FROM test 
WHERE LEVEL <= 3 
START WITH name = 'item1' 
CONNECT BY PRIOR name = parent_name 

Results

| PARENT_NAME | NAME | 
|-------------|-------| 
|  (null) | item1 | 
|  item1 | item2 | 
|  item2 | item4 | 
|  item1 | item3 | 
相关问题