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
動物を指定すると、両方の親を取得してから、その子孫をすべて取得するようにこれを拡張する方法を見つけようとしています。
何かご意見は?(これはOracle 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