Genealogia consulta no Oracle
-
13-09-2019 - |
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)
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