문제

나는 Oracle 데이터베이스에서 동물의 계보 트리를 가져 오려고 노력하고 있습니다.

테이블은 다음과 같습니다.

Animal
------------------------
Animal_ID
Parent_Male_ID
Parent_Female_ID
....
....
------------------------

동물을 지정하면 다음과 같은 것을 사용하여 모든 후손 (남성 쪽)을 얻을 수 있습니다.

SELECT *
FROM animal
START WITH animal_id = 123
CONNECT BY PRIOR animal_id = parent_male_id

나는 동물을 지정하면 부모를 모두 가져오고 모든 후손을 가져올 수있는 방식으로 이것을 확장 할 수있는 방법을 찾으려고 노력하고 있습니다.

이견있는 사람? (이것은 오라클 9.2)

도움이 되었습니까?

해결책

SELECT  *
FROM    animal
START WITH
        animal_id IN
        (
        SELECT  parent_male_id
        FROM    animal
        WHERE   animal_id = 123
        UNION ALL 
        SELECT  parent_female_id
        FROM    animal
        WHERE   animal_id = 123
        )
CONNECT BY
        PRIOR animal_id IN (parent_male_id, parent_female_id)

그러나이 쿼리는 상당히 느립니다.

이것을 사용하는 것이 좋습니다 :

SELECT  DISTINCT(animal_id) AS animal_id
FROM    (
        SELECT  0 AS gender, animal_id, father AS parent
        FROM    animal
        UNION ALL
        SELECT  1, animal_id, mother
        FROM    animal
        )
START WITH
        animal_id IN
        (
        SELECT  father
        FROM    animal
        WHERE   animal_id = 9500
        UNION ALL 
        SELECT  mother
        FROM    animal
        WHERE   animal_id = 9500
        )
CONNECT BY
        parent = PRIOR animal_id
ORDER BY
        animal_id

, 사용 할 것입니다 HASH JOIN 그리고 훨씬 빠릅니다.

성능 세부 정보는 내 블로그 에서이 항목을 참조하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top