티스토리 뷰

일반적인 리커시브 테이블의 쿼리형태는 아래와 같죠..

select  substr(sys_connect_by_path(colname,','),2)
   from tabname
connect by prior rn+1 = rn
    start with rn = 1

뭐.. 대충 여기까지는 Database 다뤄보신 분이라면 다 아시는 부분이라고 생각해요.

근데.. 하나 더 있죠.

select  substr(sys_connect_by_path(a.colname,','),2)
   from (select colname, 1 all, rownum rn from tabname) a
connect by prior a.rn+1 = a.rn
    and prior all = all
   start with rn = 1

연결되지 않는 정보들을 연결하기 위해 상수나, window function을 써서
그룹을 강제로 만들어주는 일 같은거요
헌데 여기까지도.. 웹서핑좀 하신분들이라면 아시겠죠?

select  substr(sys_connect_by_path(colname,','),2)
   from tabname
where connect_by_isleaf = 1
connect by prior rn+1 = rn
    start with rn = 1

sys_connect_by_path는 mysql의 group_concat과 같이
참으로 유용한 기능인데요. 많은 데이터의 경우에는 독이 될수도 있죠.
그리고 약간 번거로운 것이 혼자서는 붙여나가는 과정과정을 모두 row로 만드는 것 밖에 못해서..
꼭 connect_by_isleaf 를 이용해서 마지막 leaf 값만 가져오는 것이 필요한데요..
connect by 절 이전에 두지 않으면 의미가 없어요.

이와 더불어 level 도 활용하면 멋진 리커시브 쿼리가 만들어지겠죠?
즐 쿼리하세용~

댓글
댓글쓰기 폼