오라클, 티베로의 계층형 쿼리는 상하 수직관계의 트리형태의 구조를 만들어 내는 쿼리입니다. START WITH절과 CONNECT BY절을 사용해서 계층형 정보를 표현할 수 있습니다. 아래에는 쇼핑몰 메뉴 데이터를 가지고, 계층형 쿼리를 설명드리겠습니다.
예시 테이블 값
MENU_CD | UP_MENU_CD | MENU_NM | SORT_NUM | USE_YN |
100001 | 0 | 패션의류 | 1 | Y |
100002 | 100001 | 티셔츠 | 1 | Y |
100003 | 100001 | 바지 | 2 | Y |
100004 | 100003 | 반바지 | 1 | Y |
100005 | 0 | 운동화 | 2 | Y |
100006 | 0 | 가방 | 3 | Y |
컬럼 설명
- MENU_CD : 메뉴 코드(고유성)
- MENU_LV : 메뉴 레벨(계층 구분)
- UP_MENU_CD : 상위 메뉴 코드
- MENU_NM : 메뉴 이름
- SORT_NUM : 계층별 정렬값
- USE_YN : 사용여부(Y:사용, N:사용안함)
예시 계층형 쿼리
SELECT LEVEL LEV
, MENU_CD
, MENU_NM
, LPAD(' ', 2*LEVEL-1) || MENU_NM as MENU_NM2
FROM MENU_TABLE
WHERE USE_YN = 'Y'
START WITH UP_MENU_CD = 0 -- 시작(부모) 위치를 정함
CONNECT BY UP_MENU_CD = PRIOR MENU_CD -- 자식데이터를 지정
ORDER SIBLINGS BY SORT_NUM
결과
LEV | MENU_CD | MENU_NM | MENU_NM2 |
1 | 100001 | 패션의류 | 패션의류 |
2 | 100002 | 티셔츠 | 티셔츠 |
2 | 100003 | 바지 | 바지 |
3 | 100004 | 반바지 | 반바지 |
1 | 100005 | 운동화 | 운동화 |
1 | 100006 | 가방 | 가방 |
결과 설명 및 쿼리 설명
계층형 구조의 조건은 부모 컬럼과 자식 컬럼이 있어야 합니다. 부모 데이터와 자식 데이터가 맵핑이 되어야 합니다. 컬럼 중 MENU_CD 자식, UP_MENU_CD 부모로 정의하겠습니다.
, LPAD(' ', 2*LEVEL-1) || MENU_NM as MENU_NM2 -- 계층별 들여쓰기(+2) 추가
START WITH UP_MENU_CD = 0 -- 시작(부모) 위치를 정함
CONNECT BY UP_MENU_CD = PRIOR MENU_CD -- 자식 데이터를 지정(맵핑)
ORDER SIBLINGS BY SORT_NUM -- 계층별 메뉴 정렬
마무리
간단한 메뉴 정보를 이용해서 오라클(Oracle), 티베로(Tibero)의 계층형 구조와 예시 쿼리로 설명을 드렸습니다. 저두 자주 사용하는 쿼리여서 이렇게 한번 포스팅해 두면 두고두고 편하게 사용이 가능할 거 같습니다. 다음 시간에는 Mysql 계층형 구조에 대해서 한번 알아보겠습니다.