MySQL 프로그래머스 | 특정 세대의 대장균 찾기 (재귀쿼리로 자식 세대 구하기)

728x90

 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/301650

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

  • 3세대 대장균의 ID(ID) 를 출력하는 SQL 문 작성
  • 결과는 대장균 ID 기준 오름차순 정렬

 

테이블

ECOLI_DATA

 

 

풀이과정

# 세대 구분 재귀쿼리 만들기

  • 재귀쿼리 첫 번째 테이블은 PARENT_ID가 NULL인 1세대의 경우, GENERATION을 1로 명명
  • 재귀쿼리 두 번째 테이블부터는 자신의 PARENT_ID가 이전 재귀쿼리 결과 테이블의 ID와 같을 때
    GENERATION이 +1씩 되도록 함 
1
2
3
4
5
6
7
8
9
10
11
12
13
WITH RECURSIVE GE AS (
    SELECT ID, 
           1 AS GENERATION
    FROM   ECOLI_DATA
    WHERE  PARENT_ID IS NULL
 
    UNION ALL
 
    SELECT A.ID, 
           B.GENERATION + 1 AS GENERATION
    FROM   ECOLI_DATA A, GE B
    WHERE  A.PARENT_ID = B.ID
)
cs

 

 

# 원래 테이블과 세대구분 테이블 조인

  • 원래 테이블의 ID가 세대 구분 테이블의 ID와 같을 때 조인되게 함 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WITH RECURSIVE GE AS (
    SELECT ID, 
           1 AS GENERATION
    FROM   ECOLI_DATA
    WHERE  PARENT_ID IS NULL
 
    UNION ALL
 
    SELECT A.ID, 
           B.GENERATION + 1 AS GENERATION
    FROM   ECOLI_DATA A, GE B
    WHERE  A.PARENT_ID = B.ID
)
 
SELECT *
FROM   ECOLI_DATA A, GE B
WHERE  A.ID = B.ID
cs

 

 

# 정답

  • 3세대 대장균의 ID만 출력하라고 했으므로 WHERE절에 GENERATION = 3 조건 주기
  • 문제에서 요구한대로 ID 별로 오름차순 정렬까지 해주면 끝!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WITH RECURSIVE GE AS (
    SELECT ID, 
           1 AS GENERATION
    FROM   ECOLI_DATA
    WHERE  PARENT_ID IS NULL
 
    UNION ALL
 
    SELECT A.ID, 
           B.GENERATION + 1 AS GENERATION
    FROM   ECOLI_DATA A, GE B
    WHERE  A.PARENT_ID = B.ID
)
 
SELECT A.ID
FROM   ECOLI_DATA A, GE B
WHERE  A.ID = B.ID
AND    B.GENERATION = 3
ORDER BY A.ID
cs

 

 

 

728x90

댓글