Unire altri tavoli nelle query dell'albero degli oracoli
-
02-07-2019 - |
Domanda
Data una tabella semplice (id, descrizione) t1, come
id description
-- -----------
1 Alice
2 Bob
3 Carol
4 David
5 Erica
6 Fred
E una tabella di relazioni padre-figlio t2, come
parent child
------ -----
1 2
1 3
4 5
5 6
Oracle offre un modo per attraversarlo come un albero con alcune estensioni di sintassi personalizzate:
select parent, child, sys_connect_by_path(child, '/') as "path"
from t2
connect by prior parent = child
La sintassi esatta non è importante e probabilmente ho commesso un errore in quanto sopra. Il cosa importante è che quanto sopra produrrà qualcosa che assomiglia
parent child path
------ ----- ----
1 2 /1/2
1 3 /1/3
4 5 /4/5
4 6 /4/5/6
5 6 /5/6
La mia domanda è questa: è possibile unire un'altra tabella all'interno di sys_connect_by_path (), come la tabella t1 sopra, per produrre qualcosa del tipo:
parent child path
------ ----- ----
1 2 /Alice/Bob
1 3 /Alice/Carol
... and so on...
Soluzione
Nella query, sostituire T2 con una sottoquery che unisce T1 e T2 e restituisce la descrizione padre, figlio e figlio. Quindi nella funzione sys_connect_by_path, fai riferimento alla descrizione figlio dalla tua subquery.
Altri suggerimenti
Sulla base dell'idea di Mike McAllister, quanto segue utilizza una tabella derivata per ottenere il risultato desiderato:
select
T.PARENT
,T.CHILD
,sys_connect_by_path(T.CDESC, '/')
from
(
select
t2.parent as PARENT
,t2.child as CHILD
,t1.description as CDESC
from
t1, t2
where
t2.child = t1.id
) T
where
level > 1 and connect_by_isleaf = 1
connect by prior
T.CHILD = T.PARENT
Nel mio problema, tutti i genitori sono ancorati sotto un "super-genitore" root, il che significa che i percorsi possono essere completamente descritti con SYS_CONNECT_BY_PATH, ovviando così alla necessità della tecnica di cagcowboy di concatenare il genitore con il percorso.
SELECT parent, child, parents.description||sys_connect_by_path(childs.description, '/') AS "path"
FROM T1 parents, T1 childs, T2
WHERE T2.parent = parents.id
AND T2.child = childs.id
CONNECT BY PRIOR parent = child