캠핑과 개발

오라클에서 데이터를 저장하다 보면 한 테이블 내에 부모 자식 관계(상하위 관계)로 표현하는 데이터가 발생될 때가 있다. 예를 들어

게시판 ↳ 공지사항 게시판 ↳ 사용자 게시판

와 같이 메뉴를 저장하는 테이블이 있다면 상위 게시판이라는 메뉴는 하위에 공지사항 게시판 메뉴, 사용자 게시판 메뉴를 하위로 가진다면, 데이터 구조는 다음과 같이 생성될 것이다.

MENUIDNAMEURLPARENTMENUID
1공지사항 게시판/notice.html2
2게시판/index.htmlnull
3사용자 게시판/user.html2

만약 쿼리를 상위 메뉴 데이터를 먼저 나오게 하고 그 뒤에 하위 메뉴들을 나오게 하려면 어떻게 해야할까? 이때 Oracle에서는 start with, connect by prior를 사용하여 데이터를 셀렉트 할수 있다.

1
2
3
4
5
6
SELECT
    menuid, name, url, parentmenuid
FROM menu
START WITH parentmenuid is null /*상위(부모)의 조건을 명시*/
CONNECT BY PRIOR menuid = parentmenuid  /*상위의 키와 하위의 키를 열결시킴*/
ORDER SIBLINGS BY menuid ASC;   /*하위데이터 정렬 조건*/

이렇게 쿼리를 사용하게 되면 다음과 같이 셀렉팅이 된다.

MENUIDNAMEURLPARENTMENUID
2게시판/index.htmlnull
1공지사항 게시판/notice.html2
3사용자 게시판/user.html2

[원문출처]http://krespo.net/171