Lv5. 멸종위기의 대장균 찾기 (MySQL)
링크: https://school.programmers.co.kr/learn/courses/30/lessons/301651
내가 작성한 코드
-- 재귀 쿼리 시작 : 모든 개체의 세대(GENERATION) 계산
WITH RECURSIVE GENERATIONS AS (
-- 가장 뿌리가 되는 1세대를 먼저 찾음
SELECT ID, PARENT_ID, 1 AS GENERATION -- 부모가 없는 대체는 무조건 1세대로 설정
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL -- 아래의 쿼리 결과를 합침(중복 포함)
SELECT E.ID, E.PARENT_ID, G.GENERATION + 1 -- 부모 세대 번호에 1을 더해 현재 세대를 구함
FROM ECOLI_DATA E -- 원본 데이터(자식 후보)
JOIN GENERATIONS G -- 이전 단계에서 찾아낸 부모 세대 데이터
ON E.PARENT_ID = G.ID
)
-- 세대 정보를 바탕으로 조건에 맞는 개체만 집계
SELECT COUNT(*) AS COUNT, GENERATION
FROM GENERATIONS
-- 자식이 없는 개체만 골라냄, 부모 ID목록에 내 ID가 존재하지 않는다면 자식이 없는 개체임
WHERE ID NOT IN (SELECT DISTINCT PARENT_ID
FROM ECOLI_DATA
WHERE PARENT_ID IS NOT NULL) -- NULL값을 제외해야 NOT IN 연산이 제대로 동작함
GROUP BY GENERATION
ORDER BY GENERATION;
재귀 쿼리에 대해 새로 배우는 계기가 되었다
재귀 쿼리의 구조
WITH RECURSIVE 테이블명 AS (
-- Anchor: 비재귀 부분 (시작점)
SELECT 컬럼1, 컬럼2, 초기값 AS 레벨
FROM 원본테이블
WHERE 시작조건
UNION ALL
-- Recursive: 재귀 부분 (반복 규칙)
SELECT T.컬럼1, T.컬럼2, R.레벨 + 1
FROM 원본테이블 T
INNER JOIN 테이블명 R ON T.부모컬럼 = R.자식컬럼 -- 자기 자신과 조인
)
-- 실행 부분 (최종 결과 조회)
SELECT * FROM 테이블명;'코딩테스트' 카테고리의 다른 글
| [26.03.02 코테(MySQL)]-대장균들의 자식의 수 구하기 (0) | 2026.03.02 |
|---|---|
| [26.02.27 코테(MySQL)]-대장균의 크기에 따라 분류하기 2 (0) | 2026.02.27 |
| [26.02.25 코테(MySQL)]-업그레이드 된 아이템 구하기 (0) | 2026.02.25 |
| [26.02.24 코테(MySQL/Oracle)]-조회수가 가장 많은 중고 게시판의 첨부파일 조회하기 (0) | 2026.02.24 |
| [26.02.23 코테(MySQL)]-연도별 대장균 크기의 편차 구하기 (0) | 2026.02.23 |