문제 출저
https://school.programmers.co.kr/learn/courses/30/lessons/301651
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이
각 세대별 자식이 없는 대장균의 ID를 구해야 합니다.
재귀 WITH인 WITH RECURSIVE를 사용합니다. WITH RECURSIVE의 형태는 초기값과 재귀 조인의 UNION ALL 한 형태로 사용합니다. WITH RECURSIVE를 통해 세대별 대장균의 자식을 구한 다음 LEFT JOIN으로 부모와 자식을 조인합니다. 그 후 자식의 PARENT_ID가 NULL인 것을 출력하여 자식이 없는 대장균 ID를 구합니다.
SQL
WITH RECURSIVE HISTORY AS (
SELECT
ID, PARENT_ID, 1 AS GENERATION
FROM
ECOLI_DATA
WHERE
PARENT_ID IS NULL
UNION ALL
SELECT
E.ID, E.PARENT_ID, H.GENERATION + 1
FROM
ECOLI_DATA AS E
INNER JOIN
HISTORY AS H ON E.PARENT_ID = H.ID
)
SELECT
*
FROM
HISTORY AS PARENT
LEFT JOIN
HISTORY AS CHILD ON PARENT.ID = CHILD.PARENT_ID
WHERE
CHILD.PARENT_ID IS NULL
ORDER BY
PARENT.GENERATION