2009-04-23 8 views
3

J'essaie d'aller chercher un arbre de généalogie d'animaux à partir de ma base de données Oracle.Généalogie Query dans Oracle

Voici le tableau:

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

Si je précise un animal, je peux obtenir tous ses descendants (sur le côté mâle) en utilisant quelque chose comme ceci:

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

Je suis en train pour trouver un moyen d'étendre cela de telle sorte que si je spécifie un animal, il ira chercher les deux parents et ensuite ira chercher tous leurs descendants.

Des pensées? (Ceci est Oracle 9.2)

Répondre

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) 

Cette requête, cependant, sera assez lente.

Mieux vaut utiliser celui-ci:

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 

, qui utilisera HASH JOIN et est beaucoup plus rapide.

Voir cette entrée dans mon blog pour plus de détails de performance: