조직도 순회하기
직원과 관리자 계층 구조를 원하는 깊이까지 탐색합니다.
조직도 순회하기은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
조직도 문제
“id, name, manager_id가 있는 employees 테이블이 주어졌을 때, 특정 관리자 아래에 있는 모든 사람을 깊이에 제한 없이 나열하십시오.” 이는 재귀 CTE 면접 문제에서 가장 흔하게 나오는 유형 중 하나입니다.
이 테이블은 자기 참조 구조입니다. manager_id가 다른 행의 id를 가리킵니다. 이 레슨에서는 조직도를 아래 방향으로(보고 직원 탐색)와 위 방향으로(지휘 체계 탐색) 모두 탐색합니다.
예시 테이블
다음과 같은 데이터를 떠올려 보십시오. CEO에게는 NULL 관리자가 있고, 나머지 사람들은 지휘 체계를 따라 위로 보고합니다.
- 1 Ada (관리자 NULL)
- 2 Ben (관리자 1)
- 3 Cleo (관리자 1)
- 4 Dan (관리자 2)
- 5 Eve (관리자 4)
따라서 깊이는 Ada → Ben → Dan → Eve입니다. 탐색하는 동안 이 구조를 기억해 두십시오.
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
manager_id INT REFERENCES employees(id)
);관리자부터 아래로 탐색하기
선택한 관리자 아래의 모든 보고 직원을 나열하려면 앵커에서 해당 관리자(또는 직속 보고 직원)를 선택하고, 재귀 멤버에서 manager_id를 따라 아래로 내려갑니다.
여기서는 Ben(id 2)에서 시작하여 그 아래에 있는 모든 사람을 수집합니다.
WITH RECURSIVE subtree AS (
SELECT id, name, manager_id, 1 AS depth
FROM employees WHERE id = 2
UNION ALL
SELECT e.id, e.name, e.manager_id, s.depth + 1
FROM employees e
JOIN subtree s ON e.manager_id = s.id
)
SELECT name, depth FROM subtree ORDER BY depth;출력 읽기
위 쿼리는 깊이 1에서 Ben, 깊이 2에서 Dan, 깊이 3에서 Eve를 반환합니다. 앵커가 Ben을 씨앗으로 만들고, 첫 번째 반복에서 Dan(Ben이 관리자임)을 찾고, 두 번째 반복에서 Eve(Dan이 관리자임)를 찾으며, 세 번째 반복에서는 아무도 찾지 못해 재귀가 중지됩니다.
면접관이 “Eve는 Ben 아래 몇 단계에 있습니까?”라고 묻는다면 depth 열이 직접 답을 제공합니다. 3에서 1을 뺀 2단계입니다.
CEO까지 위로 탐색하기
반대 방향의 문제도 똑같이 자주 나옵니다. “Eve의 전체 지휘 체계를 CEO까지 보여 주십시오.” 조인 방향을 뒤집으면 됩니다. 이제 재귀 멤버가 현재 행의 manager_id를 따라 부모로 올라갑니다.
WITH RECURSIVE chain AS (
SELECT id, name, manager_id, 1 AS lvl
FROM employees WHERE id = 5
UNION ALL
SELECT e.id, e.name, e.manager_id, c.lvl + 1
FROM employees e
JOIN chain c ON e.id = c.manager_id
)
SELECT name, lvl FROM chain ORDER BY lvl;아래와 위 탐색: 조인이 뒤집힙니다
아래로 탐색하는 것과 위로 탐색하는 것의 유일한 구조적 차이는 조인 조건입니다.
- 아래로 탐색(보고 직원 찾기):
e.manager_id = cte.id— 관리자가 이미 확보한 행인 직원을 찾습니다. - 위로 탐색(관리자 찾기):
e.id = cte.manager_id— 식별자가 현재 행의 관리자와 일치하는 직원을 찾습니다.
이 방향 전환을 명확하게 설명할 수 있으면 면접관에게 좋은 인상을 줄 수 있습니다.
들여쓰기된 트리 만들기
완성도 높은 답변은 depth를 사용해 공백을 반복함으로써 출력을 들여쓰기된 트리 형태로 표시합니다. 이는 계층 구조의 결과를 계산할 뿐 아니라 보기 좋게 제시할 수 있다는 것을 보여 줍니다.
WITH RECURSIVE org AS (
SELECT id, name, 1 AS depth
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, o.depth + 1
FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT REPEAT(' ', depth - 1) || name AS tree
FROM org
ORDER BY depth;경로 누적하기
CEO에서 각 사람까지의 전체 경로를 보여 주려면 path 문자열을 함께 전달하십시오. 이전 레슨에서 배운 기법을 조직도에 적용하는 것입니다.
WITH RECURSIVE org AS (
SELECT id, name, CAST(name AS VARCHAR(500)) AS path
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, o.path || ' / ' || e.name
FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT name, path FROM org ORDER BY path;관리자별 보고 직원 수 세기
자주 나오는 추가 질문은 다음과 같습니다. “각 관리자에게 직간접적으로 보고하는 사람은 몇 명입니까?” 관리자별 재귀 하위 트리를 만든 다음 집계하십시오. 일반적인 패턴은 루트별로 재귀를 한 번 실행하고 씨앗 관리자를 기준으로 GROUP BY하는 것입니다.
여기서는 전체 트리를 탐색하고 루트 아래의 행을 세어 CEO인 Ada 아래의 모든 간접 보고 직원 수를 계산합니다.
WITH RECURSIVE org AS (
SELECT id, name, manager_id, 0 AS depth
FROM employees WHERE id = 1
UNION ALL
SELECT e.id, e.name, e.manager_id, o.depth + 1
FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT COUNT(*) - 1 AS total_reports FROM org;흔한 실수
면접관이 만들어 둔 다음과 같은 함정에 주의하십시오.
- 잘못된 조인 방향 — 위로 올라가려는 상황에서
e.manager_id = cte.id를 사용하면 잘못된 집합이 반환됩니다. - 앵커 필터 누락 —
WHERE id = X를 생략하면 모든 행이 씨앗이 되어 전체 계층 구조가 반환됩니다. - 깊이의 1만큼 어긋남 — 씨앗을 깊이 0으로 할지 1로 할지 결정하고 일관되게 유지하십시오.
왜 셀프 조인만 사용하지 않을까요
셀프 조인은 고정된 수의 계층을 가져올 수 있습니다. 직속 보고 직원을 찾으려면 한 번, 그 아래 직원을 찾으려면 두 번 조인하는 식입니다. 하지만 깊이를 미리 알고 계층마다 조인을 하나씩 작성해야 합니다.
재귀 CTE는 하나의 쿼리로 임의의, 알 수 없는 깊이를 처리합니다. 면접관이 “계층의 깊이는 얼마든지 될 수 있습니다”라고 말한다면 일반 셀프 조인은 적합하지 않으며 재귀를 사용하라는 신호입니다.
빠른 확인
탐색 방향을 뒤집을 수 있는지 확인해 보십시오.
복습
조직도 순회는 자기 참조 테이블에 적용하는 재귀적 뼈대입니다:
- 아래로: 관리자를 시작점으로 지정하고
e.manager_id = cte.id와 조인합니다. - 위로: 직원을 시작점으로 지정하고
e.id = cte.manager_id와 조인합니다. depth는 들여쓰기에,path는 전체 경로에 사용합니다.- 재귀는 자기 조인으로는 처리할 수 없는, 깊이를 알 수 없는 계층도 처리합니다.
다음: 재귀를 사용해 숫자와 날짜 수열 생성하기.
자주 묻는 질문
“조직도 순회하기” 강의는 무료인가요?
네 — “조직도 순회하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“조직도 순회하기”에서 뭘 배우나요?
직원과 관리자 계층 구조를 원하는 깊이까지 탐색합니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“조직도 순회하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.