엄청나게 오랜만에 포스팅을 작성하니 감회가 새롭네요 ㅠ_ㅠ 그것도 2012년을 하루 남기고!
오늘은 계층형 메뉴 트리를 정렬하는 쿼리에 대해 소개합니다.
이에 앞서 메뉴 트리 테이블의 구조를 보여드리면 다음과 같습니다.
컬럼명 |
설명 |
MENU_CODE |
메뉴가 가지는 고유의 일련번호 (PK) |
MENU_TITLE |
메뉴 이름 |
MENU_URL |
메뉴를 눌렀을 때 연결되는 URL 주소값 |
MENU_PARENT |
★ 메뉴의 부모 값 (계층 구조를 이루게 하는 요소) ★ |
MENU_SEQ |
메뉴 정렬 순서 |
MENU_LEVEL |
메뉴 계층구조의 깊이 (값이 클수록 하위 메뉴) |
MENU_VISIBLE |
메뉴 사용여부 (이 컬럼은 없어도 무관합니다) |
위의 컬럼을 가지고 있다는 전제하에 어떤 식으로 계층형 메뉴 트리를 정렬하는 지 설명드리겠습니다.
1. 각각의 MENU_CODE는 MENU_PARENT라는 부모값을 가지고 있다.
단, ROOT 값이 되는 최상위 메뉴는 PARENT를 가지지 않을 수 있다.
2. ROOT값이 되는 최상위 메뉴부터 순차적으로 나열한다.
3. MENU_CODE 순으로 나열하는 것을 기본으로 하되, 각각의 MENU_CODE에 딸려있는 자식 MENU를 하위로 두고
각각의 자식 MENU들은 MENU_SEQ의 순서로 나열되어진다.
간단한 예를 들어보겠습니다.
MENU_CODE |
MENU_TITLE |
MENU_URL |
MENU_PARENT |
MENU_SEQ |
MENU_LEVEL |
MENU_VISIBLE |
1 |
OJAVA |
|
1 |
1 |
Y |
|
2 |
JAVA |
|
1 |
1 |
2 |
Y |
3 |
DATABASE |
|
1 |
2 |
2 |
Y |
4 |
ORACLE |
/oajva/db/oracle.ora |
3 |
1 |
3 |
Y |
5 |
FRAMEWORK |
|
2 |
1 |
3 |
Y |
6 | STRUTS2 | /oajva/struts2.xml | 5 | 1 | 4 | Y |
7 | MY-SQL | /oajva/db/mysql.sql | 3 | 2 | 3 | Y |
* MENU_LEVEL도 물론 정렬에 크게 필요한 컬럼은 아니지만, DEPTH 구성에서 들여쓰기 등에 사용할 수 있습니다.
* MENU 구성에서 임시로 보여지지 않는 MENU가 필요없다면 MENU_VISIBLE도 만들지 않아도 괜찮습니다.
해당 구성을 위의 조건에 맞춰서 정렬시키면 다음과 같은 구조를 생각할 수 있습니다.
MENU_CODE |
MENU_TITLE |
MENU_URL |
MENU_PARENT |
MENU_SEQ |
1 |
OJAVA |
|
1 |
|
2 |
JAVA | 1 |
1 |
|
5 |
FRAMEWORK |
|
2 |
1 |
6 |
STRUTS2 |
/oajva/struts2.xml | 5 |
1 |
3 |
DATABASE |
|
1 |
2 |
4 |
ORACLE |
/oajva/db/oracle.ora | 3 |
1 |
7 |
MY-SQL | /oajva/db/mysql.sql | 3 |
2 |
위와같이 정렬하기 위한 쿼리문을 살펴보겠습니다. (MENU_TITLE의 DEPTH에 따른 들여쓰기는 생략합니당)
SELECT A.MENU_CODE,
A.MENU_TITLE,
A.MENU_URL,
A.MENU_PARENT,
A.MENU_SEQ
FROM TBL_MENU A
WHERE A.MENU_CODE IN
(1,2,3,4,5,6,7) -- 여기에는 사용자별로 메뉴에 대한 VIEW 권한을 가지는 경우, 사용자별 볼 수 있는 MENU_CODE가 들어가면 됩니다.
CONNECT BY PRIOR A.MENU_CODE = DECODE(A.MENU_CODE, A.MENU_PARENT, NULL, A.MENU_PARENT)
START WITH A.MENU_CODE = '1' -- 시작하는 MENU_CODE의 번호
ORDER SIBLINGS BY A.MENU_SEQ ASC, A.MENU_CODE ASC;
음~ 계층별 정렬 어렵지 않아여 ㅋ_ㅋ
2012년 안녕! 2013년에 또 포스팅 올릴 수 있기를 ㅠㅠ
2012.12 오혜영
'DataBase > ORACLE' 카테고리의 다른 글
[ORACLE] 객체 참조를 위한 SYNONYM 생성 및 사용 방법 (0) | 2021.11.29 |
---|---|
[Oracle] 순위 결정을 위한 ROW_NUMBER, RANK, DENSE_RANK 함수 사용법 비교 (0) | 2021.01.27 |
[Oracle] 19c Upgrade : 전환 시 고려사항 (0) | 2020.10.11 |
[Oracle] 특정 값 기준으로 정렬하기 (0) | 2020.03.31 |
ORACLE에서 LONG 열에만 입력할 수 있다고 할 때는? (0) | 2013.02.04 |