Oracle의 계보 쿼리
-
13-09-2019 - |
문제
나는 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
그리고 훨씬 빠릅니다.
성능 세부 정보는 내 블로그 에서이 항목을 참조하십시오.
제휴하지 않습니다 StackOverflow