본문 바로가기
DB/SQL

[프로그래머스] 특정 세대의 대장균 찾기

by 델버 2024. 10. 28.

 

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

결과는 3세대 대장균의 ID를 출력.

유념해야 할 것은 1세대 대장균은 `PARENT_ID` 조건으로 찾는 것이다.

 

2가지 접근 방법이 있다.

1. 무식하게 3번 돌리기

2. WTE(WITH RECURSIVE)


1. 무식하게 3번 돌리기

장점: 구현 빠름

단점: 4, 5 ..n 세대를 구하려면 겉잡을 수 없이 쿼리가 복잡하고 커진다.

SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IN (
    SELECT ID
    FROM ECOLI_DATA
    WHERE PARENT_ID IN (
        SELECT ID
        FROM ECOLI_DATA
        WHERE PARENT_ID IS NULL
    )
)

2.  WTE(WITH RECURSIVE)

WITH RECURSIVE를 이용해서 재귀로 전체 테이블을 탐색해 세대를 추출하여 찾으려는 세대를 조회

장점: 1번의 단점이 쉽게 보완된다. 원하는 세대를 쿼리 크기 변경 없이 조건만 바꿔주면 된다. 더 좋은 장점은 쿼리가 1번보다 단순하고 가독성 좋다.

단점: 전체 테이블을 재귀로 모두 탐색하므로 테이블 스캔 범위에 주의할 필요가 있다.

WITH RECURSIVE GENERATIONS AS (
    SELECT
        ID, 
        PARENT_ID, 
        1 AS GENERATION
    FROM
        ECOLI_DATA
    WHERE
        PARENT_ID IS NULL
    UNION ALL
    SELECT
        E.ID,
        E.PARENT_ID,
        G.GENERATION + 1 AS GENERATION
    FROM
        ECOLI_DATA AS E
    INNER JOIN
        GENERATIONS AS G
        ON E.PARENT_ID = G.ID
)
SELECT
    ID
FROM
    GENERATIONS
WHERE
    GENERATION = 3

 

댓글