이 글은 프로그래머스 SQL 문제 중 "세대별 자식이 없는 대장균 개체 수"를 구하는 문제를 재귀 없이 JOIN 방식으로 푼 예시를 설명한 것이다. 정답 처리는 안 될 수 있으나, SQL 개념 학습에는 굉장히 유익하다.
ECOLI_DATA 테이블에는 대장균 개체들의 정보가 있다.
| 컬럼명 | 설명 |
|---|---|
| ID | 개체 고유 ID |
| PARENT_ID | 부모 개체의 ID (최초 개체는 NULL) |
| SIZE_OF_COLONY | 개체 크기 |
| DIFFERENTIATION_DATE | 분화 날짜 |
| GENOTYPE | 형질 정보 |
목표:
a가 현재 개체면, b는 a.parent_id = b.id로 부모CASE 문으로 세대 구분:CASE
WHEN a.parent_id IS NULL THEN 1
WHEN b.parent_id IS NULL THEN 2
WHEN c.parent_id IS NULL THEN 3
ELSE 4
END AS GENERATION
a는 현재 개체, b, c는 각각 상위 조인된 부모 개체들LEFT JOIN + WHERE child.id IS NULL 사용LEFT JOIN ecoli_data child ON child.parent_id = a.id
WHERE child.id IS NULL
a 입장에서 자식이 존재하지 않으면 child가 NULL로 남는다GROUP BY GENERATION으로 세대별로 묶고 COUNT(*)로 개수 셈ORDER BY GENERATION으로 오름차순 정렬SELECT
COUNT(*) AS COUNT,
GENERATION
FROM (
SELECT
a.id,
CASE
WHEN a.parent_id IS NULL THEN 1
WHEN b.parent_id IS NULL THEN 2
WHEN c.parent_id IS NULL THEN 3
ELSE 4
END AS GENERATION
FROM ecoli_data a
LEFT JOIN ecoli_data b ON b.id = a.parent_id
LEFT JOIN ecoli_data c ON c.id = b.parent_id
LEFT JOIN ecoli_data child ON child.parent_id = a.id
WHERE child.id IS NULL
) AS SUB
GROUP BY GENERATION
ORDER BY GENERATION ASC;
| 개념 | 설명 |
|---|---|
| SELF JOIN | 부모-자식 관계 추적에 사용 |
| CASE | 세대 분류용 조건문 |
| LEFT JOIN + IS NULL | 자식 없는 개체 판별 |
| GROUP BY + COUNT | 세대별 개수 집계 |
실전 SQL 문제에서 재귀 없이도 트리 구조를 추적할 수 있다는 중요한 예시이며,
JOIN과 조건 조합만으로도 상당히 많은 계층적 데이터를 처리할 수 있다는 걸 보여주는 사례이다.