🌳 Oracle에서 계층형 쿼리
계층형 쿼리는 Oracle에서 조직도, 카테고리, 메뉴, 댓글처럼 트리 구조를 가진 데이터를 조회할 때 사용합니다.
Oracle은 이를 위해 강력한 구문인 START WITH
, CONNECT BY
, LEVEL
을 제공합니다.
📁 1. 계층형 테이블 구조 예시
CREATE TABLE category (
id NUMBER PRIMARY KEY,
name VARCHAR2(100),
parent_id NUMBER
);
INSERT INTO category VALUES (1, '전자제품', NULL);
INSERT INTO category VALUES (2, '컴퓨터', 1);
INSERT INTO category VALUES (3, '노트북', 2);
INSERT INTO category VALUES (4, '데스크탑', 2);
INSERT INTO category VALUES (5, '가전제품', 1);
🧵 2. 기본 계층형 쿼리 구문
SELECT id, name, parent_id, LEVEL
FROM category
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id;
키워드 |
설명 |
START WITH |
루트(최상위) 노드를 지정 |
CONNECT BY |
부모-자식 연결 조건 설정 |
PRIOR |
부모-자식 방향 지정 (위 → 아래) |
LEVEL |
트리의 깊이를 나타냄 (1부터 시작) |
🌲 3. 트리 구조 시각화
🔹 트리 들여쓰기 출력
SELECT LPAD(' ', LEVEL * 2) || name AS tree_name
FROM category
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id;
전자제품
컴퓨터
노트북
데스크탑
가전제품
🪜 4. 전체 경로 출력 (SYS_CONNECT_BY_PATH)
SELECT name, SYS_CONNECT_BY_PATH(name, ' > ') AS full_path
FROM category
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id;
전자제품 > 전자제품
컴퓨터 > 전자제품 > 컴퓨터
노트북 > 전자제품 > 컴퓨터 > 노트북
🔁 5. 형제 노드 정렬 (ORDER SIBLINGS BY)
SELECT LPAD(' ', LEVEL * 2) || name AS tree_name
FROM category
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
ORDER SIBLINGS BY name;
❌ 6. 순환 참조 방지 (NOCYCLE)
SELECT id, name
FROM category
START WITH parent_id IS NULL
CONNECT BY NOCYCLE PRIOR id = parent_id;
🧠 7. 실무 활용 팁
팁 |
설명 |
LEVEL 사용 |
UI 들여쓰기나 정렬에 유용 |
SYS_CONNECT_BY_PATH |
전체 경로 문자열 만들기 |
ORDER SIBLINGS BY |
형제끼리 정렬 |
CONNECT_BY_ISLEAF |
리프 노드 판별 (1이면 최하위) |
SELECT name, CONNECT_BY_ISLEAF
FROM category
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id;
📦 8. 전체 예제 정리
SELECT
LPAD(' ', LEVEL * 2) || name AS tree_name,
LEVEL,
CONNECT_BY_ISLEAF AS is_leaf,
SYS_CONNECT_BY_PATH(name, ' > ') AS full_path
FROM category
START WITH parent_id IS NULL
CONNECT BY PRIOR id = parent_id
ORDER SIBLINGS BY name;
✅ 마무리 정리
- Oracle은 트리 구조 쿼리에 매우 강력한 내장 기능을 제공함
- UI에 트리 구조를 출력하거나, 전체 경로를 출력할 때 매우 유용
- 재귀 쿼리보다 간단하게 계층 구조를 처리할 수 있음