
안녕하세요, 공부하는 감자입니다 🥔
SQLD 공부하면서 계층형 질의만 보면 머리가 하얘지던 시절이 있었어요. PRIOR가 왼쪽에 붙으면 순방향이었나 역방향이었나, 매번 헷갈렸거든요.
그런데 외우는 방법을 바꾸고 나서는 한 번도 안 틀렸습니다.
PRIOR가 붙은 컬럼 = 직전 행(기준 행)의 그 컬럼 값.
이 한 줄이면 끝나요.
PRIOR emp_id = mgr_id→ 직전 행의 emp_id로 다음 행의 mgr_id를 찾는다 → 부모에서 자식으로, 순방향PRIOR mgr_id = emp_id→ 직전 행의 mgr_id로 다음 행의 emp_id를 찾는다 → 상사를 따라 올라가는 역방향
컬럼명이 parent_id든 boss_id든 같은 원리로 풀립니다. 계층형은 2과목에서 매회 1
2문제, 2
4점짜리인데 이 한 줄로 거의 다 가져갈 수 있어요.
기본 구조 빠르게
SELECT 컬럼들
FROM 테이블
[WHERE 조건]
START WITH 시작조건 -- 트리의 루트를 어디로 잡을지
CONNECT BY [PRIOR] 부모자식조건 -- 부모-자식을 어떻게 이을지
[ORDER SIBLINGS BY 정렬컬럼]; -- 같은 부모 밑 형제끼리만 정렬
직접 그려보기 — 조직도 예제
이런 직원 테이블이 있다고 할게요.
STAFF_TREE
| id | staff_name | sup_id |
|---|---|---|
| 10 | 대표 | NULL |
| 20 | 영업이사 | 10 |
| 30 | 개발이사 | 10 |
| 40 | 영업팀장 | 20 |
| 50 | 영업사원 | 40 |
대표(10)
├── 영업이사(20)
│ └── 영업팀장(40)
│ └── 영업사원(50)
└── 개발이사(30)
순방향(대표 → 사원) 으로 전개하면:
SELECT LEVEL, staff_name
FROM STAFF_TREE
START WITH sup_id IS NULL
CONNECT BY PRIOR id = sup_id;
| LEVEL | staff_name |
|---|---|
| 1 | 대표 |
| 2 | 영업이사 |
| 3 | 영업팀장 |
| 4 | 영업사원 |
| 2 | 개발이사 |
직전 행의 id로 다음 행의 sup_id를 찾으니, 위에서 아래로 내려가는 거예요.
역방향(사원 → 대표) 은 시작점과 PRIOR 위치가 바뀝니다.
SELECT LEVEL, staff_name
FROM STAFF_TREE
START WITH id = 50
CONNECT BY PRIOR sup_id = id;
| LEVEL | staff_name |
|---|---|
| 1 | 영업사원 |
| 2 | 영업팀장 |
| 3 | 영업이사 |
| 4 | 대표 |
직전 행의 sup_id(상사 번호)로 다음 행의 id를 찾으니, 계속 위로 올라가는 거죠.
제일 많이 틀리는 함정: 평가 순서
계층형 질의의 평가 순서는 이렇습니다.
START WITH → CONNECT BY → WHERE → SELECT → ORDER BY
핵심은 WHERE가 트리를 다 만든 뒤에 가지치기만 한다는 점이에요.
-- 영업이사 행만 빠지고, 그 밑의 영업팀장·영업사원은 살아남음 → 4행
SELECT staff_name
FROM STAFF_TREE
WHERE staff_name <> '영업이사'
START WITH sup_id IS NULL
CONNECT BY PRIOR id = sup_id;
반면 같은 조건을 CONNECT BY 안에 AND로 넣으면 얘기가 달라집니다.
-- 영업이사 노드에서 전개가 끊겨 자식까지 통째로 잘림 → 대표, 개발이사 2행
CONNECT BY PRIOR id = sup_id AND staff_name <> '영업이사'
"특정 직원을 제외하면 결과가 몇 행인가?"라는 문제가 이 차이를 노립니다.
WHERE면 자식 생존, CONNECT BY 안이면 가지째 절단.
이것만 기억하세요.
나머지 함정 셋
- START WITH 생략 → 에러가 아니라 모든 행이 각자 시작점이 돼서 결과 행이 폭증합니다. 5행짜리 테이블이면 트리 5개가 동시에 만들어지는 셈
- 순환 참조 → A의 상사가 B, B의 상사가 다시 A면 무한 루프(ORA-01436).
CONNECT BY NOCYCLE로 끊고,CONNECT_BY_ISCYCLE로 순환 행을 표시할 수 있어요 - 일반 ORDER BY → 트리 순서가 깨집니다. 구조를 유지한 채 형제만 정렬하려면 반드시
ORDER SIBLINGS BY
의사컬럼 4종은 그대로 출제됩니다
네 개 모두 위 조직도 예제에 대입해서 외우는 게 빠릅니다.
| 의사컬럼 | 의미 | 위 예제 기준 |
|---|---|---|
| LEVEL | 트리 깊이 (루트=1) | 1, 2, 3, 4 |
| CONNECT_BY_ROOT 컬럼 | 그 행의 루트 값 | 모든 행에서 '대표' |
| CONNECT_BY_ISLEAF | 리프면 1, 아니면 0 | 영업사원 → 1 |
| SYS_CONNECT_BY_PATH(컬럼, '/') | 루트부터의 경로 | /대표/영업이사/영업팀장 |
SYS_CONNECT_BY_PATH는 출력이 그대로 보기에 나와서 구분자 위치를 정확히 알아야 해요. 첫 글자 앞에도 구분자가 붙습니다. /대표이지 대표가 아니에요.
시험장에서는 손으로 그리세요
복잡한 계층형 문제는 머리로 풀려고 하지 말고 그리는 게 빠릅니다. 데이터 보고 트리부터 그리고 → PRIOR 방향 화살표 표시 → START WITH 노드에 동그라미 → LEVEL 숫자 채우기 → WHERE는 맨 마지막에 가지치기.
이 순서로 하면 5분 안에 끝나요.
이 유형은 실무에서 안 써본 분들이 대부분이라 결국 반복 노출이 답인데, 저는 문어CBT에서 계층형 포함된 회차를 골라 반복해서 풀었어요. 무료라 부담 없이 돌리기 좋더라고요.
SQLD·정처기·컴활·ADsP 무료 CBT 모의고사
기출 변형 문제, 자동 채점, 회차별 실력 추적까지 가입 없이 바로 풀어보세요.
sqldpass.com
시험 전날 이 글의 PRIOR 한 줄과 평가 순서만 다시 보고 들어가면, 계층형 문제는 점수 주는 문제가 됩니다.
'자격증 > SQLD' 카테고리의 다른 글
| SQLD 기출복원 최신 회차 모음 — 58회부터 무료로 풀어보기 (0) | 2026.06.23 |
|---|---|
| SQLD 62회 접수 7/20 시작, 이번 놓치면 11월까지 없어요 (0) | 2026.06.23 |
| SQLD NULL 연산 정리, 오답률 1위 유형 (0) | 2026.06.20 |
| SQLD 조인 문제, 결국 '몇 행이 나오느냐' 싸움입니다 (0) | 2026.06.20 |
| 2026 SQLD 일정 정리, 회차별 접수·시험·발표일 (0) | 2026.06.16 |