3세대의 대장균의 ID(ID) 를 출력하는 SQL 문을 작성해주세요. 이때 결과는 대장균의 ID 에 대해 오름차순 정렬해주세요.
# 재귀CTE를 사용하지 않은 방법
# 테이블 별로 ID의 의미: ONE이 1세대, TWO가 2세대, THREE가 3세대
SELECT THREE.ID
FROM ECOLI_DATA AS ONE
JOIN ECOLI_DATA AS TWO ON (ONE.ID = TWO.PARENT_ID AND ONE.PARENT_ID IS NULL)
JOIN ECOLI_DATA AS THREE ON TWO.ID = THREE.PARENT_ID
ORDER BY 1;
# 재귀CTE를 사용한 답안
WITH RECURSIVE GEN_E AS (
# 1세대 대장균
SELECT ID, 1 AS GEN
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL
# 2세대부터의 대장균
SELECT E.ID, GEN + 1
FROM ECOLI_DATA E INNER JOIN GEN_E P ON E.PARENT_ID = P.ID
)
SELECT ID
FROM GEN_E
WHERE GEN = 3 # 3세대의 대장균만 추출
ORDER BY 1;
3세대의 대장균을 추출하는 문제여서 JOIN을 두 번 사용하면 풀 수 있는 문제였다. 그런데 문제의 의도는 재귀CTE를 사용하는 것 같아, 이후에 다시 문제를 풀었을 때는 재귀CTE방법을 사용했다.
PARENT_ID가 NULL이라는 조건을 걸어주는 걸 잊지 말아야 한다. 그래야 2세대, 3세대 대장균도 제대로 추출할 수 있다!GEN컬럼에 몇 세대인지 표시하게 했다.WITH RECURSIVE GEN_E AS (
# 1세대 대장균
SELECT ID, 1 AS GEN
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
UNION ALL
# 2세대부터의 대장균
SELECT E.ID, GEN + 1
FROM ECOLI_DATA E INNER JOIN GEN_E P ON E.PARENT_ID = P.ID
)
이후 WHERE에 조건을 걸어 3세대 대장균만 추출한 뒤, ID로 오름차순 정렬을 했다.
SELECT ID
FROM GEN_E
WHERE GEN = 3 # 3세대의 대장균만 추출
ORDER BY 1;
처음에는 코드에 자세한 설명을 쓰려다가, 생각해보니 이 부분은 익숙해져야 하는 부분이라 간단히 메모만 해놓았다. 설명을 써놓는 것보다 나중에 다시 문제를 풀게 될 때 코드를 따라쓰는게 더 도움이 될 거 같다.