2015-10-06 41 views
0

假设公司的层次结构是这样的:甲骨文分层查询选择记录

King 
-> John 
    -> Jack 
    -> Chris 
    -> Sean 
    -> April 
-> Jerry 
    -> Tom 

鉴于祖先例如Kingsubordinate,例如, Chris,是否可以在一个查询中选择路径/King/John/Jack/Chris中的所有记录?即查询将返回4条记录 - King, John, Jack and Chris

表结构: Employee_Name的Employee_ID MANAGER_ID

MANAGER_ID引用EMPLOYEE_ID

+1

是的,这是可能的。你应该从Chris'开始,选择所有的父母。表格定义和样本数据将会有所帮助。 [我想你可以从这里开始...](http://stackoverflow.com/questions/2319284/sql-recursive-query-on-self-refrencing-table-oracle) – valex

回答

0
with t as 
(
    select 'King' as Employee_Name, 1 as Employee_ID, -1 as Manager_ID from dual union all 
    select 'John' as Employee_Name, 2 as Employee_ID, 1 as Manager_ID from dual union all 
    select 'Jack' as Employee_Name, 3 as Employee_ID, 2 as Manager_ID from dual union all 
    select 'Chris' as Employee_Name, 4 as Employee_ID, 3 as Manager_ID from dual union all 
    select 'Sean' as Employee_Name, 5 as Employee_ID, 3 as Manager_ID from dual union all 
    select 'April' as Employee_Name, 6 as Employee_ID, 2 as Manager_ID from dual union all 
    select 'Jerry' as Employee_Name, 7 as Employee_ID, 1 as Manager_ID from dual union all 
    select 'Tom' as Employee_Name, 8 as Employee_ID, 7 as Manager_ID from dual 
) 
select Employee_Name 
from t 
connect by prior Manager_ID = Employee_ID 
start with Employee_Name = 'Chris' 
order by level desc 
0

我不知道你的表结构是什么。如果你将它作为路径存储,那么下面的内容应该可以工作。该查询支持Chris的多条记录。它会选择所有的。

with test as 
    (
    select 1 id, '/King/John/Jack/Chris' str from dual union all 
    select 2 id, '/King/John/Jack/April' str from dual union all 
    select 3 id, '/King/John/Jack/Sean' str from dual union all 
    select 4 id, '/King/Jerry/Tom' str from dual 
) 
    select id, 
      str, 
     regexp_substr (str, '[^/]+', 1, rn) split, 
      rn 
    from test 
    cross 
    join (select rownum rn 
      from (select max (length (regexp_replace (str, '[^/]+'))) + 1 mx 
        from test 
       ) 
     connect by level <= mx 
     ) A 
    where regexp_substr (str, '[^/]+', 1, rn) is not null 
    and instr(str, 'Chris') > 0 
    order by id, rn 
; 

这里是SQL小提琴为例

Example in SQL Fiddle

诀窍是交叉连接创建用于主表的每一行多行。

ID STR SPLIT RN 
1 /King/John/Jack/Chris King 1 
1 /King/John/Jack/Chris John 2 
1 /King/John/Jack/Chris Jack 3 
1 /King/John/Jack/Chris Chris 4