여러개의 테이블을 계층형으로... 0 1 2,344

by 암소핫 [SQL Query] Connect By 계층형 [2013.08.19 23:54:26]



안녕하세요. 언제나 질문게시판에서 많이 배워갑니다.

각각의 테이블에서 공통된 코드를 가지고 계층형으로 표현할 수 있는 지 궁금해서 질문 드립니다.

예전에는 한 개의 테이블에 code 컬럼, up_code 컬럼 이렇게 주어진 컬럼에 계층형으로 표현했지만

다른 테이블에서 공통된 코드를 가지고 와 계층형으로 표현할 수 있는 지 궁금해서 그렇습니다.

아래와 같은 트리 구조를 쿼리 한번으로 표현할 수 있나요?

A-----
   |
   A.a-----
     |-----1.안녕하세요.
     |-----2.반갑습니다.
   A.b-----
     |-----1.바나나
|-----2.커피
B-----
    |
   B.a-----
  |-----1.B-a-1 입니다..
C-----
   |
   C.a-----
  |-----1.하이

대문자 A,B,C는 one_grp 이라는 테이블에 데이터가 있고
소문자 A.a, A.b, B.a... two_grp 이라는 테이블에 데이터가 있고
숫자 1,2,3는 three_grp 이라는 테이블에 데이터가 있다고 가정하겠습니다.


with one_grp as(
SELECT 'A' AS CODE, '1' AS SORT FROM DUAL
UNION ALL
SELECT 'B', '2' FROM DUAL
UNION ALL
SELECT 'C', '3' FROM DUAL
)

with two_grp as(
SELECT 'A.a' AS CODE, 'A' as UP_CODE, '1' AS SORT FROM DUAL
UNION ALL
SELECT 'A.a', 'A', '2' FROM DUAL
UNION ALL
SELECT 'B.a', 'B', '1' FROM DUAL
UNION ALL
SELECT 'C.a', 'C', '1' FROM DUAL
)

with three_grp as(
SELECT '1' AS CODE, 'A.a' as UP_CODE, '1' AS SORT, '안녕하세요' AS COMM FROM DUAL
UNION ALL
SELECT '2', 'A.a', '2', '반갑습니다' FROM DUAL
UNION ALL
SELECT '1', 'A.b', '1', '바나나' FROM DUAL
UNION ALL
SELECT '2', 'A.b', '2', '커피' FROM DUAL
UNION ALL
SELECT '1', 'B.a', '1', 'B-a-1 입니다' FROM DUAL
UNION ALL
SELECT '1', 'C.a', '1', '하이' FROM DUAL
)


CODE 컬럼과 UP_CODE 컬럼을 이용해서 계층형으로 만들 수 있나요?
아니면 UNION ALL로 다 합쳐서 쿼리를 짜야 되나요?

답변 주시면 감사하겠습니다^^
by 우리집아찌 [2013.08.20 09:08:01]
-- UNION ALL 쓰는방법밖에 몰라서 ㅡㅡ;
with one_grp as(
SELECT 'A' AS CODE, '1' AS SORT FROM DUAL
UNION ALL 
SELECT 'B', '2' FROM DUAL
UNION ALL 
SELECT 'C', '3' FROM DUAL
) , two_grp as(
SELECT 'A.a' AS CODE, 'A' as UP_CODE, '1' AS SORT FROM DUAL
UNION ALL 
SELECT 'A.b', 'A', '2' FROM DUAL
UNION ALL 
SELECT 'B.a', 'B', '1' FROM DUAL
UNION ALL 
SELECT 'C.a', 'C', '1' FROM DUAL
) , three_grp as(
SELECT '1' AS CODE, 'A.a' as UP_CODE, '1' AS SORT, '안녕하세요' AS COMM FROM DUAL
UNION ALL 
SELECT '2', 'A.a', '2', '반갑습니다' FROM DUAL
UNION ALL 
SELECT '1', 'A.b', '1', '바나나' FROM DUAL
UNION ALL 
SELECT '2', 'A.b', '2', '커피' FROM DUAL
UNION ALL 
SELECT '1', 'B.a', '1', 'B-a-1 입니다' FROM DUAL
UNION ALL 
SELECT '1', 'C.a', '1', '하이' FROM DUAL
) 

SELECT * 
FROM 
(SELECT CODE , NULL UP_CODE , SORT , '' COMM FROM one_grp UNION ALL
 SELECT CODE , UP_CODE  , SORT , ''    FROM two_grp UNION ALL
 SELECT CODE , UP_CODE  , SORT , COMM   FROM three_grp ) 
START WITH UP_CODE IS NULL
CONNECT BY PRIOR CODE = UP_CODE     
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입