계층형 쿼리 오라클, 티베로 START WITH CONNECT BY

오라클, 티베로의 계층형 쿼리는 상하 수직관계의 트리형태의 구조를 만들어 내는 쿼리입니다. 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 계층형 구조에 대해서 한번 알아보겠습니다.




Mysql 테이블 컬럼 정보 찾는 쿼리

오라클 & 티베로 시노님(synonym) 간편 사용법

오라클 & 티베로 테이블 찾는 방법