Unirse a otras tablas en consultas del árbol de Oracle
-
02-07-2019 - |
Pregunta
Dada una tabla t1 simple (id, descripción), como
id description
-- -----------
1 Alice
2 Bob
3 Carol
4 David
5 Erica
6 Fred
Y una tabla de relaciones padre-hijo t2, como
parent child
------ -----
1 2
1 3
4 5
5 6
Oracle ofrece una forma de recorrer esto como un árbol con algunas extensiones de sintaxis personalizadas:
select parent, child, sys_connect_by_path(child, '/') as "path"
from t2
connect by prior parent = child
La sintaxis exacta no es importante y probablemente cometí un error en lo anterior.Lo importante es que lo anterior producirá algo que se ve
parent child path
------ ----- ----
1 2 /1/2
1 3 /1/3
4 5 /4/5
4 6 /4/5/6
5 6 /5/6
Mi pregunta es esta:¿Es posible unirse a otra tabla dentro de sys_connect_by_path(), como la tabla t1 anterior, para producir algo como:
parent child path
------ ----- ----
1 2 /Alice/Bob
1 3 /Alice/Carol
... and so on...
Solución
En su consulta, reemplace T2 con una subconsulta que una T1 y T2 y devuelva una descripción principal, secundaria y secundaria.Luego, en la función sys_connect_by_path, haga referencia a la descripción secundaria de su subconsulta.
Otros consejos
Basado en la idea de Mike McAllister, lo siguiente utiliza una tabla derivada para lograr el resultado deseado:
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
En mi problema, todos los padres están anclados bajo una raíz "superpadre", lo que significa que las rutas se pueden describir completamente con SYS_CONNECT_BY_PATH, obviando así la necesidad de la técnica de cagcowboy de concatenar el padre con la ruta.
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