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
댓글