2009-09-18 109 views
2

我希望我能解释令我感到困惑的问题。 我有以下的分层数据集(这是34K的记录只是子集)分层查询

PARENT_ID CHILD_ID   EXAM 
TUDA12802 TUDA12982   N 
TUDA12982 TUDA12984   J  
TUDA12984 TUDA999   J 
TUDA12982 TUDA12983   N 
TUDA12983 TUDA15322   J 
TUDA12983 TUDA15323   J 

这是树的表示

TUDA12982 N 
- TUDA12984 J 
-- TUDA999 J 
- TUDA12983 N 
-- TUDA15322 J 
-- TUDA15323 J 

我需要的是与考试所有记录的列表= N和底层考试='J'记录,可以嵌套。

select * 
from test1 
connect by prior child_id = parent_id 
start with child_id = 'TUDA12982' 
order siblings by child_id; 

给我

PARENT_ID  CHILD_ID   EXAM 
TUDA12802 TUDA12982   N 
TUDA12982 TUDA12984   J  
TUDA12984 TUDA999   J 
TUDA12982 TUDA12983   N 
TUDA12983 TUDA15323   J 
TUDA12983 TUDA15322   J 

但我需要的是

TUDA12802 TUDA12982   N 
TUDA12982 TUDA12984   J 
TUDA12984 TUDA999   J 

这些运行需要停止的时候我遇到考试= 'N' 记录。

我需要像'停止与'条款。

select * 
from test1 
connect by prior child_id = parent_id 
start with child_id = 'TUDA12982' 
stop with exam = 'N' 
order siblings by child_id; 

这怎么办?

回答

4

罗伯特,

您可通过添加做到这一点 “考试= 'J'” 的CONNECT BY子句:

SQL> create table test1(parent_id,child_id,exam) 
    2 as 
    3 select 'TUDA12802', 'TUDA12982', 'N' from dual union all 
    4 select 'TUDA12982', 'TUDA12984', 'J' from dual union all 
    5 select 'TUDA12984', 'TUDA999', 'J' from dual union all 
    6 select 'TUDA12982', 'TUDA12983', 'N' from dual union all 
    7 select 'TUDA12983', 'TUDA15322', 'J' from dual union all 
    8 select 'TUDA12983', 'TUDA15323', 'J' from dual 
    9/

Tabel is aangemaakt. 

SQL> select parent_id 
    2  , child_id 
    3  , exam 
    4  , level 
    5  , lpad(' ',2*level) || sys_connect_by_path(parent_id||'-'||child_id,'/') scbp 
    6  from test1 
    7 start with exam = 'N' 
    8 connect by prior child_id = parent_id 
    9  and exam = 'J' 
10/

PARENT_ID CHILD_ID E LEVEL SCBP 
--------- --------- - ------ ---------------------------------------------------------------------- 
TUDA12802 TUDA12982 N  1 /TUDA12802-TUDA12982 
TUDA12982 TUDA12984 J  2  /TUDA12802-TUDA12982/TUDA12982-TUDA12984 
TUDA12984 TUDA999 J  3  /TUDA12802-TUDA12982/TUDA12982-TUDA12984/TUDA12984-TUDA999 
TUDA12982 TUDA12983 N  1 /TUDA12982-TUDA12983 
TUDA12983 TUDA15322 J  2  /TUDA12982-TUDA12983/TUDA12983-TUDA15322 
TUDA12983 TUDA15323 J  2  /TUDA12982-TUDA12983/TUDA12983-TUDA15323 

6 rijen zijn geselecteerd. 

问候, 罗布。

+0

就是这样。如此简单和优雅。我以为我遇到了非常棘手的问题。非常感谢你。 Je gaat het pas zien als je he het doorhebt。 (Johan Cruijff) – 2009-09-18 12:48:29

0

听起来像一个简单的查询得到所要求的项目和它的“J”孩子是你想要的,所以这是不是工作:

select * 
from test1 
where child_id = 'TUDA12982' 
or exam = 'J' 
connect by prior child_id = parent_id 
start with child_id = 'TUDA12982' 
order siblings by child_id; 

我没有甲骨文,所以我不能测试这是否有效,但从我对语法的理解以及我刚刚谷歌搜索它看起来会起作用。

+0

这也给出了记录: TUDA12983 \t \t TUDA15322Ĵ TUDA12983 \t \t TUDA15323Ĵ 这些都是考试的儿童的=“N”的记录和考试=“N”的记录不应该被遍历。 – 2009-09-18 12:00:26