varias unir una tablas tabla sola misma hacer consultas consultar consulta como arbol sql oracle tree connect-by

una - unir dos tablas sql server



Unirse a otras tablas en consultas de árbol oráculo (3)

Dada una tabla simple (id, descripción) t1, como

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

Y una tabla de relación 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 me he equivocado en lo anterior. Lo importante es que lo anterior producirá algo que se parece a

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...


En su consulta, reemplace T2 con una subconsulta que se una a T1 y T2, y devuelva la 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.


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


Basado en la idea de Mike McAllister, lo siguiente usa 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 "superparental", 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 al padre con la ruta.