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...
¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top