문제 링크입니다.
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씩 증가하여 세대를 표시합니다.
'Skills > SQL' 카테고리의 다른 글
[프로그래머스] SQL - '멸종위기의 대장균 찾기' 문제풀이 (0) | 2024.05.01 |
---|---|
[프로그래머스] SQL - 'FrontEnd 개발자 찾기' 문제풀이 (0) | 2024.04.30 |
[SQL] 등급 매기기 함수 : NTILE (0) | 2024.04.25 |
[SQL] 순위 함수 : RANK, DENSE_RANK, ROW_NUMBER (0) | 2024.04.24 |
[프로그래머스] SQL - '연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기' 문제풀이 (0) | 2024.04.23 |