Menu
Coddy logo textTech

계층 구조 탐색

Coddy SQL 여정의 심화 과정 섹션에 포함된 레슨 — 27개 중 21번째.

재귀적 CTE가 존재하는 진짜 이유: 단일 테이블에 저장된 부모/자식 관계를 탐색하는 것입니다. employees 테이블에 동일한 테이블을 다시 가리키는 manager_id 컬럼이 있다고 가정해 보겠습니다:

WITH RECURSIVE chain AS (
    SELECT id, name, manager_id
    FROM employees WHERE id = 7              -- anchor: 시작 직원
    UNION ALL
    SELECT e.id, e.name, e.manager_id
    FROM employees e
    JOIN chain c ON e.id = c.manager_id      -- recursive: 관리자로 이동
)
SELECT * FROM chain

각 단계는 CTE를 employees에 다시 조인하여 트리에서 한 단계 위로 올라갑니다. 행에 매니저가 없으면 재귀가 자연스럽게 중단됩니다(JOIN이 일치하는 항목을 찾지 못함).

challenge icon

챌린지

중급

사용 가능한 테이블 및 컬럼:

  • <strong>categories</strong>: <strong>id</strong>, <strong>name</strong>, <strong>parent_id</strong>

각 카테고리는 다른 카테고리를 가리키는 선택적인 parent_id를 가집니다. 카테고리 id = 1의 하위 카테고리(자식, 손자, …)인 모든 카테고리를 반환하되, 카테고리 1 자체는 포함하지 않습니다. idname을 반환하고, id를 기준으로 정렬하세요.

치트 시트

단일 테이블에 저장된 부모/자식 관계(예: 동일한 테이블을 다시 가리키는 manager_id 또는 parent_id 열)를 탐색하려면 재귀적 CTE를 사용하세요:

WITH RECURSIVE chain AS (
    SELECT id, name, manager_id
    FROM employees WHERE id = 7          -- anchor: 시작 행
    UNION ALL
    SELECT e.id, e.name, e.manager_id
    FROM employees e
    JOIN chain c ON e.id = c.manager_id  -- recursive: 부모로 이동
)
SELECT * FROM chain

JOIN이 일치하는 행을 찾지 못하면(예: 매니저가 없는 행) 재귀가 자연스럽게 중단됩니다.

직접 해보기

WITH RECURSIVE descendants AS (
    -- anchor: id 1의 직계 자식들
    -- recursive: 그들의 자식들 등
)
SELECT id, name FROM descendants ORDER BY id
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

심화 과정의 모든 레슨