[MS-SQL] SQL(쿼리) CTE 이용하여 재귀적(트리) 표현하기 > db

본문 바로가기

db

[MS-SQL] SQL(쿼리) CTE 이용하여 재귀적(트리) 표현하기

페이지 정보

작성자 서방님 댓글 0건 조회 28회 작성일 14-02-11 13:57

본문

개발질 하다가 트리 구조를 가져와야 하는 녀석이 있어서 , 오라클 처럼 재귀표현을 할 수 있는 쿼리가 있나 찾아보니 있네요.

2005년 버전 이후부터 된다고 합니다.

 

겸사 겸사... 제가 까먹음..나중에 써먹고.. 필요한분 쓰시라고 올려둡니다.

 

먼저 테이블은 아래와 같습니다.

01.jpg  

 

이 녀석을  아래와 같은 트리 구조로 뽑아 보겠습니다.

 

02.jpg

 

이런 형태로 트리로 뽑을 수가 있습니다.

 

해당하는 쿼리는 아래와 같습니다.

 

WITH test(parent , node , level , sort)
AS
(
 SELECT parent , node , 1 AS level ,
           CONVERT(varchar(255), parent + ' ' + node) as sort
    FROM   ctest
    WHERE  parent = '1'
 UNION ALL
    SELECT a.parent , a.node , level+1 AS level ,
           CONVERT(varchar(255), RTRIM(sort) + '|    ' + a.parent + ' ' + a.node) as sort
 FROM   ctest a , test b
 WHERE  a.parent = b.node
)
SELECT * FROM test
order by sort

일단 두번째 사진처럼 뽑기 위한 쿼리는 위와 같습니다.

 

구조를 잠시 설명 드리면 ,

with (

 select ....

union all

 select ....

)

select....

 

처음 select 에 해당하는 부분이 실제 데이터를 가져오게한 쿼리의

SELECT parent , node , 1 AS level ,
           CONVERT(varchar(255), parent + ' ' + node) as sort
    FROM   ctest
    WHERE  parent = '1'
이 부분인데 , 여기서 WHERE  parent = '1' 이런형태로 루트가 되는 녀석을 지정해주면 됩니다.

 

두번째 select 에 해당하는 부분이 실제 데이터를 가져오게한 쿼리의

 SELECT a.parent , a.node , level+1 AS level ,
           CONVERT(varchar(255), RTRIM(sort) + '|    ' + a.parent + ' ' + a.node) as sort
 FROM   ctest a , test b
 WHERE  a.parent = b.node
이 부분인데 , 여기서 WHERE  a.parent = b.node 이 부분의 모자 관계입니다.

 

머... 아웃풋 내기에 정신이 없어 , 상세 스펙이 나온 MSDN을 제대로 보지는 않았지만 , 왠지 생긴거만 봐서는

재귀로 돌면서 두번째 select에 설정된 부모기준으로 첫번째 select 로 가져온 녀석을 합치는거 아닌가 하는 생각이 듭니다.

정말 그런건지는 상세 스펙을 보지 않아서 모르고 , 생긴거만 봐서는 그렇지 않은가 합니다.

 

아~ 그리고 마지막 select 는 무엇을 보이게 할지 설정하는 부분이라고 보시면 되구요.

 

level << 이 부분은 몇 레벨인지 표시하기 위한 부분입니다.

 

sort 이 부분은 계층적으로 표현하기 위한 , 일종의 후루꾸 기법이 아닌가 하는 생각이 듭니다.

실제로 sort 컬럼을 지워버리시고 , 데이터를 추출하면 계측정으로 데이터는 가져오지만 계층적으로 표현은 안됩니다.

예를 들어....

0레벨

1레벨

1레벨

2레벨

2레벨

3레벨

3레벨

이딴식으로 나오드라구요.

 

아마도 대부분의 개발자분들이

0레벨

  1레벨

    2레벨

       3레벨

       3레벨

    2레벨

  1레벨

표현이 필요하지 않을까 합니다. 모~ 저만 필요한건지는 모르겠지만요.

 

그럼~ 대한민국 모든 개발자가 칼퇴하여 , 지랄같은 직업이라고 접는 일이 없는 그날까지.....

 

댓글목록

등록된 댓글이 없습니다.

Total 447건 1 페이지
게시물 검색

회원로그인

접속자집계

오늘
361
어제
457
최대
592
전체
39,970

그누보드5
Copyright © seobangnim.com All rights reserved.
자바스크립트를 활성화 하세요![ 브라우저에서 자바스크립트를 활성화하는 방법 ]