본문 바로가기
DB

[DB] 댓글 계층형 쿼리

by 늑인 2024. 4. 3.

🌳 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에 트리 구조를 출력하거나, 전체 경로를 출력할 때 매우 유용
  • 재귀 쿼리보다 간단하게 계층 구조를 처리할 수 있음

'DB' 카테고리의 다른 글

[DB] 셀프 조인  (0) 2024.07.31
[DB] 신입들이 읽어 보면 좋을 사이트 링크  (0) 2024.05.27
[DB] 이전글 다음글 쿼리  (0) 2024.03.26
[DB] LISTAGG 사용법  (0) 2024.03.22
[DB] 디비 정규화  (0) 2024.02.19