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

StackOverflow https://stackoverflow.com/questions/117512

  •  02-07-2019
  •  | 
  •  

Вопрос

Учитывая простую (идентификатор, описание) таблицу 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top