프로그래머스
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를 수행하는 것이 성능면에서 뛰어남
'SQL' 카테고리의 다른 글
[프로그래머스 SQL KIT] SELECT #2 - 서울에 위치한 식당 목록 출력하기 (0) | 2025.04.08 |
---|---|
[SQL] NULL 값 변환하기 - IFNULL, COALESCE (1) | 2025.01.28 |
[SQL] DATE TYPE 다루기 - 특정 일자 조회하기 DATE_FORMAT, YEAR(), MONTH(), (0) | 2025.01.28 |
[프로그래머스 SQL KIT] JOIN #6 - 그룹별 조건에 맞는 식당 목록 출력 (1) | 2025.01.28 |
[프로그래머스 SQL KIT] JOIN #5 - FrontEnd 개발자 찾기 : bit 연산 (1) | 2025.01.28 |