SQL
[프로그래머스 SQL KIT] SELECT#1 - 특정 세대의 대장균 찾기
enayoiii
2025. 4. 8. 14:02
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
- 3세대 대장균의 ID조회
- 자식 세대 대장균은 `PARENT_ID`컬럼에 부모 대장균 ID가 기록되어 있음
- 1세대 대장균은 `PARENT_ID`가 NULL
코드
select ID
from ECOLI_DATA
where PARENT_ID IN (SELECT ID FROM ECOLI_DATA WHERE PARENT_ID IN
(SELECT ID FROM ECOLI_DATA WHERE PARENT_ID IS NULL))
코드 설명
- 1세대 대장균의 부모 ID = NULL이므로, 이를 이용해 1세대 대장균의 ID를 추출 (내부 쿼리 1)
- 1세대 대장균의 ID를 추출한것을 바탕으로, 1세대 대장균의 ID가 부모ID라면 2세대 대장균. 이를 이용해 2세대 대장균 ID 추출 (내부 쿼리 2)
- 2세대 대장균의 ID를 부모 ID로 가지면 3세대 대장균.(최외곽 쿼리)
즉, 3중 SELECT문을 이용해 구현한다.
다른 풀이 - EXISTS 사용
SELECT e3.ID
FROM ECOLI_DATA e3
WHERE EXISTS (
SELECT 1
FROM ECOLI_DATA e2
WHERE e3.PARENT_ID = e2.ID
AND EXISTS (
SELECT 1
FROM ECOLI_DATA e1
WHERE e2.PARENT_ID = e1.ID
AND e1.PARENT_ID IS NULL
)
);
EXISTS와 IN의 차이
- EXISTS는 조건을 만족하는 행을 찾으면 즉시 종료되므로 존재 여부만 판단
- IN은 서브쿼리에 특정 값들이 포함되어 있으면 True, 없으면 False를 리턴해 모든 행에 대해 서브쿼리 수행
- 검사할 값이 많다면, EXISTS를 수행하는 것이 성능면에서 뛰어남