2014-10-03 3 views
0

"test"라는 테이블이 있습니다. 상위 및 하위 열을 포함합니다.Oracle에서 상위 상위 수준 또는 필드를 어떻게 찾을 수 있습니까?

Parent Child 
    1  101 
    1  102 
    1  103 
101  121 
101  123 
103  133 
121  80 
121  81 

이제 주어진 "1"값에 대한 모든 하위/부모를 가져 오는 쿼리를 작성했습니다.

(SELECT parent,child,LEVEL FROM TEST 
    START WITH child= 1 
    CONNECT BY PRIOR parent=child) 
UNION ALL 
    (SELECT parent,child,LEVEL FROM TEST 
     START WITH parent=1 
     CONNECT BY PRIOR child=parent) 
     ORDER BY parent 

그러나 나는 주어진 값과 관계없이 그 계층에있는 모든 자식/부모를 원합니다. "80"을 주면 .... 나는 가장 좋은 부모 값 (이 경우 "1")을 가져 와서 그 가장 높은 부모 값 아래에있는 모든 자식을 검색해야합니다.

SELECT parent AS ancestor 
    FROM X 
    WHERE CONNECT_BY_ISLEAF <> 0 
    START WITH child=80 
    CONNECT BY PRIOR parent=child 
--   ^^^^^^^^^^^^^^^^^^ 
--    ascendant order 

는 "궁극적 인 조상을"일단, 두 번째 재귀 쿼리를 얻을 모든 자손 :

+0

내가 당신의 필요를 이해하기 힘든 시간을 보내고 있습니다. 당신은 _ "공통 조상을 가진 모든 아이들"_을 찾고 계십니까? –

+0

'80 '의'가장 좋은 부모 가치 '를'1 '로 만드는 것은 무엇입니까? 사실 그것은 오름차순 정렬 목록에서 가장 낮은 값이기 때문입니까? –

+0

@ Caffé 필자가 이해하는 한, '1'은 궁극적으로 '80 '의 조상이다 : 80 => 121 => 101 => 1'. 그러나 그 후에해야 할 일이 무엇인지 분명하지 않습니다. '1'의 모든 자손 찾기? 아니면 "직접적인"아이들 만? –

답변

2

당신은 노드의 궁극적 인 조상을 찾기 위해 재귀 쿼리 및 의사 열 CONNECT_BY_ISLEAF를 사용할 수 있습니다 해당 노드에서 :

SELECT child AS descendant, LEVEL 
    FROM X 
    START WITH parent=1 
    CONNECT BY PRIOR child=parent 
--   ^^^^^^^^^^^^^^^^^^ 
--   descendant order 

을 사용하면 노드와 노드의 궁극적 인 조상 사이의 "거리"를 알고 허용 LEVEL 의사 열을 유의하시기 바랍니다.

모두 함께 퍼팅 :

SELECT child AS descendant, LEVEL 
    FROM X 
    START WITH parent IN (

    SELECT parent AS ancestor 
     FROM X 
     WHERE CONNECT_BY_ISLEAF <> 0 
     START WITH child=80 
     CONNECT BY PRIOR parent=child 

) 
    CONNECT BY PRIOR child=parent 

제작, 샘플 데이터 제공 :

DESCENDANT LEVEL 
101   1 
121   2 
80   3 
81   3 
123   2 
102   1 
103   1 
133   2 
+0

답변 해 주셔서 감사합니다. 그것은 나의 목적을 위해 봉사한다. – Anitha

+0

+1, 설명하는 것이 좋습니다! –

+0

필자는 조사한 결과 Teradata에서 Connect By 절이 없음을 확인했습니다. Teradata에서 같은 일을하고 싶다면 같은 질문에 대한 내 접근 방식은 무엇입니까? 재귀 적 요소 질의의 사용 .... 어떻게해야합니까? – Anitha