0Pricing
SQL Interview Prep · 강의

조직도 순회하기

직원과 관리자 계층 구조를 원하는 깊이까지 탐색합니다.

조직도 순회하기은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 앵커 및 재귀 구성원
  2. 조직도 순회하기
  3. 숫자 및 날짜 계열 생성하기
  4. 무한 재귀 방지하기
← SQL Interview Prep(으)로 돌아가기