본문 바로가기
Skills/SQL

[프로그래머스] SQL - '특정 세대의 대장균 찾기' 문제풀이

by 602yu 2024. 4. 29.

 

 

 

문제 링크입니다.

https://school.programmers.co.kr/learn/courses/30/lessons/301650

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

문제 설명

 

 

 

 

 

문제

 

3세대의 대장균의 ID(ID) 를 출력하는 SQL 문을 작성해주세요. 이때 결과는 대장균의 ID 에 대해 오름차순 정렬해주세요.

 

 

 

풀이1 - WITH문 2개 사용

 

WITH E1 AS ( -- 1세대
    SELECT ID
    FROM ECOLI_DATA 
    WHERE PARENT_ID IS NULL
), E2 AS ( -- 2세대
    SELECT ID
    FROM ECOLI_DATA 
    WHERE PARENT_ID IN (SELECT * FROM E1)
)

-- 3세대
SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IN (SELECT * FROM E2)
ORDER BY ID

 

 각 세대마다 CTE를 사용하여 각각의 세대를 직접 추출하는 접근 방식입니다. 이 방법은 순차적으로 1,2,3세대를 구해 간단하고 직관적이지만, 세대의 수가 많아질수록 CTE의 개수가 늘어나고 쿼리가 복잡해질 수 있습니다.

 

 

 

풀이2 - WITH RECURSIVE 사용
WITH RECURSIVE ECOLI_TREE AS (
	-- Non-Recursive
    SELECT ID,
        PARENT_ID,
        1 AS GENERATION
    FROM ECOLI_DATA
    WHERE PARENT_ID IS NULL
    
    UNION ALL
    
    -- Recursive
    SELECT A.ID,
        A.PARENT_ID,
        B.GENERATION + 1
    FROM ECOLI_DATA AS A
        INNER JOIN ECOLI_TREE AS B ON A.PARENT_ID = B.ID
)

-- 3세대 선택
SELECT ID
FROM ECOLI_TREE
WHERE GENERATION = 3
ORDER BY ID

 

WITH RECURSIVE 는 재귀 쿼리 문법입니다.

 

ECOLI_TREE CTE: 

   1. CTE는 재귀적으로 자기 자신을 호출하여 계층 구조를 만듭니다. 시작점은 PARENT_ID가 NULL인 행으로, 이 행들은 1세대에 해당합니다.

   2. 각 단계에서 GENERATION 열이 1씩 증가하여 세대를 표시합니다.