문제
이전에 아래 글처럼 특정 세대의 대장균을 찾은 적이 있다. 이때 서브쿼리를 재귀처리하여 사용했었는데 문제를 보자마자 일단 재귀로 각 세대를 다 찾아야겠구나 생각이 들었는데 또 다시 코드 노가다를 해야하나 싶었다.
그러다가 RECURSIVE라는 재귀용 함수를 찾았다. (효자다 효자)
RECURSIVE를 통해 각 대장균의 세대를 다 구해주니 너무 편하게 원하는 테이블을 만들었다.
이후 해당 테이블을 셀프 조인하고 세대별로 그룹화 한 뒤 문제를 해결했다.
코드
WITH RECURSIVE G AS (
SELECT D.ID, PARENT_ID, 1 AS GENERATION
FROM ECOLI_DATA D
WHERE PARENT_ID IS NULL
UNION ALL
SELECT D.ID, D.PARENT_ID, GENERATION + 1
FROM ECOLI_DATA D
INNER JOIN G ON G.ID = D.PARENT_ID
)
SELECT COUNT(*) AS COUNT, G1.GENERATION
FROM G g1 LEFT JOIN G g2 ON g1.ID = g2.PARENT_ID
WHERE g2.ID IS NULL
GROUP BY g1.GENERATION
ORDER BY 2 ASC;
'DB > Programmers SQL Kit' 카테고리의 다른 글
[My_SQL] Lv.4 언어별 개발자 분류하기 (0) | 2024.06.17 |
---|---|
[My_SQL] Lv.4 우유와 요거트가 담긴 장바구니 (0) | 2024.06.10 |
[My_SQL] Lv.4 취소되지 않은 진료 예약 조회하기 (0) | 2024.06.10 |
[My_SQL] Lv.4 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기 (0) | 2024.06.10 |
[My_SQL] Lv.3 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 (0) | 2024.06.10 |