문제

다음과 같은 간단한 (id, 설명) 테이블 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

내 질문은 이것입니다:위의 t1 테이블과 같이 sys_connect_by_path() 내에서 다른 테이블을 조인하여 다음과 같은 것을 생성할 수 있습니까?

parent  child  path
------  -----  ----
1       2      /Alice/Bob
1       3      /Alice/Carol
... and so on...
도움이 되었습니까?

해결책

쿼리에서 T2를 T1과 T2를 조인하고 상위, 하위 및 하위 설명을 반환하는 하위 쿼리로 바꿉니다.그런 다음 sys_connect_by_path 함수에서 하위 쿼리의 하위 설명을 참조합니다.

다른 팁

Mike McAllister의 아이디어를 기반으로 다음은 파생 테이블을 사용하여 원하는 결과를 얻습니다.

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