2013-10-12 3 views
2

안녕하세요, 루트 노드 나 리프 노드가 아닌 계층 적 테이블 (빨간색 원으로 표시) 중 하나에서 중산층 관리자를 검색하는 데 도움이 필요합니다.계층 적 쿼리 (중간 노드 검색 방법)

계층 차트/데이터 Hierarchical Chart Data

나는 내 쿼리

select level, first_name ||' '|| last_name "FullName" 
from more_employees 
where employee_id not in (select NVL(manager_id, 0) from more_employees) 
start with employee_id = 1 
CONNECT by prior employee_id = manager_id; 
를 사용하여 모든 잎 노드를 검색 할 수 있었다

Result

나는 내가 사용해야 확신 키워드 "in"내 where 절에 있지만 다른 결과가 계속. 이 같은

답변

2

당신은이에 대한 CONNECT_BY_IS_LEAF 의사 열을 사용할 수 있다고 생각 작동합니다.

select level, first_name ||' '|| last_name "FullName" 
from more_employees 
where connect_by_isleaf = 0 and manager_id is not null 
start with employee_id = 1 
connect by prior employee_id = manager_id; 
당신은 모든 잎을 얻기 위해 그것을 사용할 수 있습니다

:

와 솔루션보다 아마도 더 빠른
select level, first_name ||' '|| last_name "FullName" 
from more_employees 
where connect_by_isleaf = 1 
start with employee_id = 1 
connect by prior employee_id = manager_id; 

하위 선택 여기

는 SQLFiddle 예입니다 http://sqlfiddle.com/#!4/511d9/2

+0

그냥 호기심. 왜 그것이 하위 선택보다 빠를 것이라고 생각합니까? –

+0

@ValentinKuzub : 테이블에 대한 단일 액세스 만 필요하기 때문입니다. 하위 선택 결과는 같은 테이블에 두 개의 쿼리 결과가됩니다. (질문에 원래 쿼리에 대해 말하지만 모든 답변을 얻으려고합니다.) –

+0

감사합니다. –

2

뭔가 내가

select * from more_employees m1 where manager_id is not null 
and exists (select 1 from more_employees m2 where m2.manager_id=m1.employee_id) 
+1

이것이 올바른 (그리고 가장 간단한) 솔루션입니다. "중간"노드는 부모가 "그들이 가리키는 곳"과 "그들에게 가리키는"아이들을 가지고 있습니다. 이는 재귀가 필요하지 않은 "NULL 포인터"만 확인하는 몇 가지 경우 중 하나입니다. – wildplasser

+0

발렌틴 감사합니다. –