Genealogía de consultas en Oracle
-
13-09-2019 - |
Pregunta
Estoy tratando de buscar un árbol genealógico de los animales de mi base de datos Oracle.
Aquí está la tabla:
Animal
------------------------
Animal_ID
Parent_Male_ID
Parent_Female_ID
....
....
------------------------
Si puedo especificar un animal, puedo conseguir todos sus descendientes (en el lado macho) usando algo como esto:
SELECT *
FROM animal
START WITH animal_id = 123
CONNECT BY PRIOR animal_id = parent_male_id
Estoy tratando de encontrar una manera de extender esto de una manera tal que si puedo especificar un animal, se ha podido ir a ambos padres y luego buscará todos sus descendientes.
¿Alguna idea? (Esto es Oracle 9.2)
Solución
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, sin embargo, será bastante lento.
Es mejor usar éste:
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 utilizará HASH JOIN
y es mucho más rápido.
Vea esta entrada en mi blog para los detalles de rendimiento:
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow