質問

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 そしてはるかに高速です。

パフォーマンスの詳細については、私のブログのこのエントリを参照してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top