https://school.programmers.co.kr/learn/courses/30/lessons/301650
코딩테스트 연습 > SELECT > 특정 세대의 대장균 찾기
문제 분석
난이도: LEVEL4
문제 요구사항
3세대의 대장균의 ID(ID) 를 출력하는 SQL 문을 작성해주세요.
이때 결과는 대장균의 ID 에 대해 오름차순 정렬해주세요.
1세대: PARENT_ID IS NULL
2세대: 1세대를 PARENT_ID로 갖는 대장균
3세대: 2세대를 PARENT_ID로 갖는 대장균
정답 코드1
WITH FIRST_CTE AS (
SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
),
SECOND_CTE AS (
SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IN (SELECT * FROM FIRST_CTE)
)
SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IN (SELECT * FROM SECOND_CTE)
ORDER BY 1
CTE를 활용한 바닐라(노가다) 쿼리
정답 코드2
WITH RECURSIVE CTE AS (
SELECT ID, 1 GENERATION -- 1세대
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL
SELECT D.ID, C.GENERATION + 1 -- 세대 추가
FROM ECOLI_DATA D JOIN CTE C
ON D.PARENT_ID = C.ID
)
SELECT ID
FROM CTE
WHERE GENERATION = 3
ORDER BY 1
재귀 CTE(Recursive CTE) 활용
PARENT_ID 가 NULL인 1세대를 찾고 GENERATION 컬럼을 추가하면서 1로 설정한다.
재귀적으로 CTE를 돌리면서 이전 세대의 ID를 PARENT_ID로 갖는 데이터를 찾고 이전 세대에서 1 추가한다.
재귀 CTE가 끝나면(더이상 세대 매칭 불가능)
재귀 CTE에서 3세대인 ID를 찾는다.
'Algorithm > Programmers SQL' 카테고리의 다른 글
[MySQL] 프로그래머스 언어별 개발자 분류하기 (0) | 2024.09.18 |
---|---|
[MySQL] 프로그래머스 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기 (1) | 2024.09.17 |
[MySQL] 프로그래머스 없어진 기록 찾기 (0) | 2024.09.16 |
[MySQL] 프로그래머스 있었는데요 없었습니다 (0) | 2024.09.16 |
[MySQL] 프로그래머스 오랜 기간 보호한 동물(1) (0) | 2024.09.16 |