링크: https://school.programmers.co.kr/learn/courses/30/lessons/301651
습득한 점:
재귀함수 사용법
활용 아이디어


재귀함수 쿼리
WITH RECURSIVE CTE(ID,PARENT_ID,GEN_N) as (
SELECT
ID,
PARENT_ID,
1 AS GEN_N
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL -- 중복 미제거 통합, 재귀에서는 거의 항상 UNION ALL 사용
SELECT
r.ID,
r.PARENT_ID,
cte.GEN_N + 1 AS GEN_N
FROM ECOLI_DATA r
INNER JOIN cte ON r.PARENT_ID = cte.ID
)
SELECT
*
# COUNT(A.GEN_N) AS COUNT,
# A.GEN_N AS GENERATION
FROM cte AS A
LEFT JOIN cte AS B ON A.ID = B.PARENT_ID
# WHERE B.PARENT_ID IS NULL
# GROUP BY A.GEN_N
# ORDER BY GENERATION ASC;

1. 재귀함수로 각 ID별 세대를 GEN_ID라는 컬럼으로 생성한다.
2. ID별 세대를 조건에 맞춰 지정 후,
셀프 조인(A테이블, B테이블)을 통해, ID와 PARENT_ID가 서로 일치하는 조건으로 LEFT 조인을 한다.
-> 자식이 존재하지 않는 ID를 찾기 위함
이후, B테이블의 ID가 "NULL" 인 값만을 찾도록 조건을 걸고, A테이블의 GEN_ID(세대)를 기준으로 그룹화하되, 그룹별 카운트를 한다.
'sql > hard' 카테고리의 다른 글
Leetcode 601 - Human Traffic of Stadium (0) | 2024.03.26 |
---|---|
프로그래머스 Lv 3 - 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2023.08.17 |
프로그래머스 Lv 4 - 그룹별 조건에 맞는 식당 목록 출력하기 (0) | 2023.07.06 |