2009-04-23 7 views
3

Ich versuche, einen Stammbaum von Tieren aus meiner Oracle-Datenbank zu holen.Genealogie-Abfrage in Oracle

Hier ist die Tabelle:

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

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

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

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

Irgendwelche Gedanken? (das ist Oracle 9.2)

Antwort

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) 

Diese Abfrage wird jedoch ziemlich langsam sein.

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 und ist viel schneller nutzen:

besser diese verwenden.

diesen Eintrag in meinem Blog für die Leistung Details: