오라클 트리 쿼리에서 다른 테이블 조인
-
02-07-2019 - |
문제
다음과 같은 간단한 (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
제휴하지 않습니다 StackOverflow