문제
https://school.programmers.co.kr/learn/courses/30/lessons/301650
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
3세대의 대장균의 ID(ID) 를 출력하는 SQL 문을 작성해주세요. 이때 결과는 대장균의 ID 에 대해 오름차순 정렬해주세요.
문제 풀이에 앞서..
자기 참조 관계
: 다른 테이블이 아닌 자기 자신과의 관계를 맺는 타입으로 순환 관계라고도 한다.
위 문제의 테이블 구조를 살펴보자.
위 테이블의 parent_id와 id를 조건으로 하여 자기참조를 하는 구문은 아래와 같이 작성할 수 있다.
select child.id as child_id , parent.id as parent_id
from ecoli_data child join (select id from ecoli_data) parent
on child.parent_id = parent.id
실행 결과는 아래와 같다.
이처럼 자기 자신과의 관계를 맺는 것을 "자기 참조 관계" 라 하며, 주로 계층 관계를 표현할 때 사용한다.
(ex. 직원 - 관리자, 부모 - 자식)
문제 풀이 1 - 자기 참조
앞선 자기 참고 관계를 이용하여 2중 JOIN문을 통해 3세대의 ID를 구한다.
1. 2세대 구하기
SELECT child.id AS gen2, parent.id AS gen1
FROM ecoli_data child
JOIN (SELECT * FROM ecoli_data) parent
ON child.parent_id = parent.id
WHERE parent.parent_id IS NULL
부모가 NULL인 부모(=1세대)를 가진 자녀를 구한다.
2. 3세대 구하기
SELECT child.id AS ID
FROM ecoli_data child
JOIN (
SELECT child.id AS gen2, parent.id AS gen1
FROM ecoli_data child
JOIN (SELECT * FROM ecoli_data) parent
ON child.parent_id = parent.id
WHERE parent.parent_id IS NULL
) past
ON child.parent_id = past.gen2
ORDER BY child.id;
1에서 구한 2세대를 부모로 하는 자녀를 구한다.
문제 풀이 2 - 서브 쿼리
같은 로직을 서브 쿼리로 구현하였다.
자기 참조 대신 WHERE - IN 조건 절을 사용하였다.
1. 2세대 구하기
# 2세대
SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IN (
# 1세대
SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
)
부모가 1세대인 자녀(=2세대)를 구한다.
2. 3세대 구하기
# 3세대
SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IN (
# 2세대
SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IN (
# 1세대
SELECT ID
FROM ECOLI_DATA
WHERE PARENT_ID IS NULL
)
)
ORDER BY ID;
1에서 구한 2세대를 부모로 하는 자녀(3세대)를 구한다.
이 방법이 맞는지에 대한 의문은 가졌지만 LEVEL 4 치고는 생각보다 쉬운 문제였다 .!!