Genealogie-Abfrage in Oracle
-
13-09-2019 - |
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)
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