Frage

Ich versuche, einen Genealogie Baum von Tieren aus meiner Oracle-Datenbank zu holen.

Hier ist die Tabelle:

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

Wenn ich ein Tier geben, ich kann alle seine Nachkommen (auf der männlichen Seite) bekommen mit so etwas wie folgt aus:

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

Ich versuche, einen Weg zu finden, diese so zu erweitern, dass, wenn ich ein Tier angeben, wird es beide Eltern holen und dann alle ihre Nachkommen holen.

Alle Gedanken? (Dies ist Oracle 9.2)

War es hilfreich?

Lösung

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)

Diese Abfrage wird jedoch sein, ganz langsam.

Besser, diese verwenden ein:

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

, die HASH JOIN verwenden und ist viel schneller.

Sehen Sie diesen Eintrag in meinem Blog für Leistungsdetails:

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top