계층형 쿼리 정리 - SQL, JPA, MyBatis
메뉴 예시로 정리하는 계층형 쿼리 정리
목차
계층형 쿼리 정리
순수 SQL과 ORM 을 사용하여 계층형 쿼리를 처리하는 방법을 정리합니다.
Oracle 기준으로 정리되었습니다.
🚀 도입
자기참조의 되어있어 무한대의 깊이가 존재하는 테이블이 있습니다.
이 경우, 계층형 쿼리를 사용하여 처리를 해야하는 경우가 있습니다.
예제
메뉴 관리를 하는 테이블이다.
하나의 메뉴는 상위 메뉴를 가질 수 있고, 그 상위 메뉴도 다시 같은 `menu` 테이블의 한 행이다.
즉 parent_id 가 자기 자신(menu.id)을 참조하는 자기 참조 구조(인접 리스트 모델, adjacency list) 로 트리를 표현한다.
[1] 홈
[2] 상품 (parent = NULL)
├─ [4] 신상품 (parent = 2)
│ ├─ [7] 의류 (parent = 4)
│ └─ [8] 전자제품 (parent = 4)
└─ [5] 베스트 (parent = 2)
[3] 고객센터 (parent = NULL)
└─ [6] 공지사항 (parent = 3)
컬럼
| 컬럼 | 타입 | 설명 |
|---|---|---|
| id | NUMBER(PK) | 메뉴 식별자 |
| name | VARCHAR2(100) | 메뉴 이름 |
| parent_id | NUMBER(FK) | 상위 메뉴의 id |
| sort_order | NUMBER |
