본문 바로가기
TIL - 프로그래밍/SQL

[프로그래머스] LV5. 멸종위기의 대장균 찾기 - MySQL (RECURSIVE)

by chaemj97 2024. 6. 13.
728x90

WITH RECURSIVE 문

WITH RECURSIVE 쿼리문을 작성하고 내부에 UNION을 통해 재귀를 구성

  • 예시 - 1씩 증가
WITH RECURSIVE CNT 
AS ( 
    -- Non-Recursive 문장( 첫번째 루프에서만 실행됨 )
    SELECT 1 AS n
    
    UNION ALL
    
    -- Recursive 문장
    SELECT n + 1 AS num 
    FROM CNT
    WHERE n < 5 
)

SELECT * FROM CNT;


https://school.programmers.co.kr/learn/courses/30/lessons/301651?language=mysql

 

프로그래머스

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

programmers.co.kr


  • 문제
    • 각 세대별 자식이 없는 개체의 수(COUNT)와 세대(GENERATION)를 출력하는 SQL문
  • 풀이
    • 재귀를 사용해서 각 대장균의 세대 구하기
      • GENERATION 테이블
        • (ID, 부모ID, N세대)
    • GENERATION 테이블에서 자식이 없는 대장균 => PARENT_ID 컬럼에 ID가 없다. 
  • 코드
# 재귀 사용

# (ID, 부모ID, N세대)
WITH RECURSIVE GENERATION AS (
    SELECT ID
        , PARENT_ID
        , 1 AS GEN
    FROM ECOLI_DATA
    WHERE PARENT_ID IS NULL
    
    UNION ALL
    
    SELECT E.ID
        , E.PARENT_ID
        , GEN + 1 AS GEN
    FROM ECOLI_DATA E
    JOIN GENERATION G
        ON E.PARENT_ID = G.ID
)

SELECT COUNT(*) AS COUNT
    , GEN AS GENERATION
FROM GENERATION
# 자식이 없다
WHERE ID NOT IN (SELECT DISTINCT PARENT_ID FROM GENERATION WHERE PARENT_ID IS NOT NULL)
GROUP BY GEN;
728x90
반응형

댓글