Pergunta

Eu estou tentando buscar uma árvore da árvore genealógica dos animais do meu banco de dados Oracle.

Aqui está a tabela:

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

Se eu especificar um animal, eu posso obter todos os seus descendentes (no lado masculino) usando algo parecido com isto:

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

Eu estou tentando encontrar uma maneira de estender esta de tal maneira a que, se eu especificar um animal, ele vai buscar ambos os pais e, em seguida, vai buscar todos os seus descendentes.

Todos os pensamentos? (Este é Oracle 9.2)

Foi útil?

Solução

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)

Esta consulta, no entanto, será bastante lento.

Melhor usar este:

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

, que usará HASH JOIN e é muito mais rápido.

Veja esta entrada no meu blog para mais detalhes de desempenho:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top