Genealogia di query in Oracle
-
13-09-2019 - |
Domanda
Sto cercando di prendere un albero genealogico di animali dal mio database Oracle.
Ecco la tabella:
Animal
------------------------
Animal_ID
Parent_Male_ID
Parent_Female_ID
....
....
------------------------
Se specifico un animale, posso ottenere tutti i suoi discendenti (sul lato maschile) utilizzando qualcosa di simile a questo:
SELECT *
FROM animal
START WITH animal_id = 123
CONNECT BY PRIOR animal_id = parent_male_id
Sto cercando di trovare un modo per estendere questo in modo tale che se a specificare un animale, sarà prendere entrambi i genitori e poi sarà a prendere tutti i loro discendenti.
Qualche idea? (Questo è Oracle 9.2)
Soluzione
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)
Questa query, tuttavia, sarà piuttosto lento.
Meglio usare questo:
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
, che utilizzerà HASH JOIN
ed è molto più veloce.
Vedere questa voce nel mio blog per i dettagli delle prestazioni:
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow