Объединение других таблиц в запросы оракула

Учитывая простоту (id, description) table t1, такую ​​как

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

И таблица отношений между родителями и дочерними элементами t2, такая как

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

Oracle предлагает способ обхода этого в виде дерева с некоторыми пользовательскими расширениями синтаксиса:

 select parent, child, sys_connect_by_path(child, '/') as "path" from t2 connect by prior parent = child 

Точный синтаксис не важен, и я, вероятно, допустил ошибку в приведенном выше. Важно то, что приведенное выше приведет к созданию чего-то похожего

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

Мой вопрос заключается в следующем: возможно ли присоединиться к другой таблице в sys_connect_by_path (), такой как таблица t1 выше, чтобы создать что-то вроде:

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

В вашем запросе замените T2 на подзапрос, который соединяет T1 и T2 и возвращает родительское, дочернее и дочернее описание. Затем в функции sys_connect_by_path укажите описание дочернего элемента из вашего подзапроса.

Основываясь на идее Майка Макаллистера, следующее использует производную таблицу для достижения желаемого результата:

 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 

В моей проблеме все родители привязаны под «супер-родительским» корнем, что означает, что пути могут быть полностью описаны с помощью SYS_CONNECT_BY_PATH, тем самым устраняя необходимость использования метода cagcowboy для конкатенации родителя с помощью пути.

 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