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. 1세대 대장균의 부모 ID = NULL이므로, 이를 이용해 1세대 대장균의 ID를 추출 (내부 쿼리 1)
  2. 1세대 대장균의 ID를 추출한것을 바탕으로, 1세대 대장균의 ID가 부모ID라면 2세대 대장균. 이를 이용해 2세대 대장균 ID 추출 (내부 쿼리 2)
  3. 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를 수행하는 것이 성능면에서 뛰어남
let textNodes = document.querySelectorAll("div.tt_article_useless_p_margin.contents_style > *:not(figure):not(pre)"); textNodes.forEach(function(a) { a.innerHTML = a.innerHTML.replace(/`(.*?)`/g, '$1'); });