2008-09-22 9 views
8

Dada una sencilla (Identificación, descripción) tabla T1, tales comoJunto a otras tablas en el árbol oráculo consulta

id description 
-- ----------- 
1 Alice 
2 Bob 
3 Carol 
4 David 
5 Erica 
6 Fred 

Y una tabla t2 relación padre-hijo, como

parent child 
------ ----- 
1  2 
1  3 
4  5 
5  6 

ofertas de Oracle una forma de atravesar 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. El Lo importante es que lo anterior producirá algo que se parece

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 la siguiente: ¿es posible unirse a otra tabla dentro de la sys_connect_by_path(), tales como la tabla T1 anteriormente, para producir algo así como :

parent child path 
------ ----- ---- 
1  2  /Alice/Bob 
1  3  /Alice/Carol 
... and so on... 

Respuesta

7

En la consulta, reemplace T2 con una subconsulta que se une a T1 y T2, y devuelve padre, hijo y la descripción del niño. Luego, en la función sys_connect_by_path, haga referencia a la descripción secundaria de su subconsulta.

+0

En otras palabras, use una tabla derivada. ¡Por supuesto! Buen truco. – dland

0
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 
+0

Eso no funciona del todo. En el caso de las jerarquías multinivel, la ruta es incorrecta. Por ejemplo David/Fred/Erica en lugar de David/Erica/Fred – dland

6

Sobre la base de la idea de Mike McAllister, los siguientes usos 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 en virtud de una raíz "súper padre", 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 elemento primario con la ruta.

+1

buen material, gracias por poner su solución aquí. Deseo que más personas lo hagan, ayuda a la siguiente persona que viene a StackOverflow a buscar esta respuesta. –

+1

¡Buen uso de la palabra obviar! :-) – cagcowboy

Cuestiones relacionadas