START WITH로 시작 지점을 정하고, CONNECT BY로 부모와 자식 연결 규칙을 정하며, PRIOR로 어느 쪽이 부모 기준인지 표시한다고 생각하면 대부분 풀립니다.
핵심 체크포인트
- START WITH는 시작 행, CONNECT BY는 연결 규칙, PRIOR는 부모 방향을 의미합니다.
- LEVEL은 깊이를 숫자로 보여줍니다.
- 형제 정렬은 ORDER SIBLINGS BY를 사용합니다.
주제별 설명
START WITH
계층 탐색을 어디서 시작할지 지정하는 절입니다.
- 최상위 노드나 특정 루트부터 내려가고 싶을 때 사용합니다.
- 시작 조건이 잘못되면 전체 트리 구조가 달라집니다.
CONNECT BY
부모와 자식 행을 어떤 조건으로 연결할지 지정합니다.
- 재귀적으로 내려가는 핵심 규칙입니다.
- 연결 기준 컬럼을 정확히 읽는 것이 가장 중요합니다.
PRIOR
부모 행 기준 컬럼이 무엇인지 표시해 연결 방향을 정합니다.
- PRIOR 위치에 따라 부모-자식 방향이 달라집니다.
- 계층형 질의에서 가장 많이 헷갈리는 키워드 중 하나입니다.
LEVEL
현재 행이 계층에서 몇 단계 깊이인지 나타내는 의사 컬럼입니다.
- 트리 깊이 표시, 들여쓰기, 특정 깊이만 필터링할 때 유용합니다.
- LEVEL 조건으로 상위 몇 단계까지만 자를 수도 있습니다.
ORDER SIBLINGS BY
같은 부모를 가진 형제 행들만 정렬하는 절입니다.
- 일반 ORDER BY를 쓰면 계층 구조가 깨질 수 있어 별도로 사용합니다.
- 트리 순서를 유지하면서 형제 노드만 정렬할 때 필요합니다.
SELECT LPAD(' ', (LEVEL - 1) * 2) || unit_name AS unit_name,
unit_id,
parent_unit_id,
LEVEL AS depth_no
FROM org_units
START WITH parent_unit_id IS NULL
CONNECT BY PRIOR unit_id = parent_unit_id
ORDER SIBLINGS BY sort_no;실습 흐름 추천
- 먼저 START WITH로 루트가 무엇인지 확인합니다.
- CONNECT BY PRIOR 구문에서 부모와 자식 방향을 말로 풀어 읽어봅니다.
- LEVEL과 ORDER SIBLINGS BY를 붙여 트리 구조가 실제로 어떻게 보이는지 확인합니다.
바로 이어서 해보려면
이론만 읽지 말고 바로 blacksql.sqld.kr에서 실행해보고, 문제 풀이 감각은 www.sqld.kr에서 이어가면 학습 속도가 훨씬 빨라집니다.
자주 묻는 질문
문장을 말로 읽어보는 것이 좋습니다. `PRIOR unit_id = parent_unit_id`는 부모의 unit_id가 현재 행의 parent_unit_id와 연결된다는 뜻입니다.
일반 ORDER BY는 전체 결과를 평평하게 다시 정렬할 수 있지만, ORDER SIBLINGS BY는 계층 구조를 유지한 채 형제끼리만 정렬합니다.