IT_Expert/DataBase | Posted by 낫기법필 2007. 12. 14. 15:56

[Oracle] SYS_CONNECT_BY_PATH 에 대한 질답

[질문]SYS_CONNECT_BY_PATH 사용법에 대해....

한 수 가르켜 주실 분?? 자료도 환영합니다.

저도 오늘 첨 써봤는데;; 아직 완벽히 이해하지는 못했습니다.

대략 감으로 때려맞춰넣는 중입니다...

보니깐 CONNECT BY PRIOR하고 같이 사용되는 것 같은데....


with a_table as
(
 select 1 as id, '사랑' as contents from dual union all
 select 2, '우정' from dual union all
 select 3, '믿음' from dual
),
b_table as
(
 select 1 as id, 'A.TXT' as filename from dual union all
 select 2, 'B.TXT' from dual union all
 select 2, 'C.TXT' from dual union all
 select 3, 'D.TXT' from dual union all
 select 3, 'E.TXT' from dual union all
 select 3, 'F.TXT' from dual
)
SELECT     id, contents, SUBSTR (MAX (SYS_CONNECT_BY_PATH (filename, ',')), 2) path#
      FROM (SELECT id, contents, filename,
                   ROW_NUMBER () OVER (PARTITION BY id ORDER BY filename) rnum
              FROM (select a.id, a.contents, b.filename from a_table a, b_table b where a.id = b.id))
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR id = id
GROUP BY id, contents


이문장을 기준으로 쉽게 이해할 수 있도록 해석 좀 해주세요.

1. SUBSTR (MAX (SYS_CONNECT_BY_PATH (filename, ',')), 2) 에서 MAX (SYS_CONNECT_BY_PATH (filename, ',')) 의 사용법과


2. CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR id = id 의 관계;;;정도??


==[답변글1]=========================================================================

blog.naver.com/xsoft

제 블로그에 이와 관련된 내용을 설명해 놓은것이 있습니다.


목록명은 - 세로 데이터를 가로로 나타내기 - 입니다.


도움이 되셨으면 좋겠습니다.

강정식(raxsoft)님이 2007-06-08 14:34:54에 작성한 댓글입니다


==[답변글2]=========================================================================

connect by ~ start with 구문 recursive 쿼리 구문입니다.

이구문은 말그래도 계속 순환하면서 조회 하는 기능으로 tree-순회시 이상적으로 사용할수 있습니다.


scott 의 emp 테이블에 mgr 을 보면 mgr은 자신의 직속관리사번을 뜻하며

그사원도 emp 테이블에 존재하죠?

이때 어떤사원의 상관을 끝까지 조회 한다고 가정해 보면


empcd mgr          C는 자신의 상관이 없는 최고사원을 뜻하고 A는 최 말단 사원입니다.

A         B             A를 기준으로 위의 자료를 추출하려면 3번의 자기 참조가 필요한 쿼리입니다.

B         C             더 문제는 이 관계의 깊이가 가변적이라면 좀 문제가 심각해 지겠죠?

C         null          오라클에서는 이를 지원하기 위해 connect by~start with 구문을 제공하는것입니다.


select * from emp x connect by prior x.mgr=x.empno start with x.empno='A';

이건 밑에서 위로 순화는 것으로 start with 지점에서 시작해서 순회를 시작합니다.

empno A를 찿고 mgr B를 확인후 다시 emp에서 empno='B'를 찿고 다시 mgr C를 찿고...


select * from emp x connect by prior x.empno=x.mgr start with x.empno='B'는

반대 방향 순회를 하게 됩니다.


이때 SYS_CONNECT_BY_PATH (field_name, ',') 은 이 추출의 순서대로 filed_name의 내용을 뒤의 구분자로 분리해서 리턴해 주는 함수로 9i 이상에서 지원하기 시작했습니다.

ㅁ님이 2007-06-08 14:58:19에 작성한 댓글입니다