[SQL] Programmers_SELECT. 특정 세대의 대장균 찾기

Programmers_SELECT. 특정 세대의 대장균 찾는 문제를 파헤쳐 보자 :)

Mar 9, 2026

1. 문제 설명

1-1. 테이블 설명

1-1-1. ECOLI_DATA 테이블

notion image
✔️ 최초의 대장균 개체의 PARENT_ID 는 NULL 값입니다.

1-2. 문제 설명

3세대의 대장균의 ID(ID) 를 출력하는 SQL 문을 작성해주세요.
이때 결과는 대장균의 ID 에 대해 오름차순 정렬해주세요.

2. 문제 풀이

2-1. 최종 풀이

SELECT A.ID FROM ECOLI_DATA A JOIN ECOLI_DATA B ON A.PARENT_ID = B.ID JOIN ECOLI_DATA C ON B.PARENT_ID = C.ID WHERE C.PARENT_ID IS NULL ORDER BY A.ID;

2-2. 단계별 풀이

2-2-1. 첫 번째 쿼리 (계층 연결)

FROM ECOLI_DATA A JOIN ECOLI_DATA B ON A.PARENT_ID = B.ID JOIN ECOLI_DATA C ON B.PARENT_ID = C.ID
📌
해당 코드를 실행하면, ECOLI_DATA 테이블을 Self Join하여 개체 간의 부모-자식 관계를 연결한다.
  • A : 현재 개체 (자식)
  • B : A의 부모
  • C : B의 부모 (조상)
즉, AC의 손자(3세대) 관계가 된다.

2-2-2. 두 번째 쿼리 (루트 조건 필터링)

WHERE C.PARENT_ID IS NULL
📌
해당 코드를 실행하면, 조상(C) 중에서 최상위 개체(루트)만 필터링한다.
  • PARENT_ID IS NULL
    • → 부모가 없는 개체 = 최상위 개체
즉, 루트로부터 시작된 계층 구조만 선택

2-2-3. 세 번째 쿼리 (결과 추출 및 정렬)

SELECT A.ID ORDER BY A.ID;
📌
해당 코드를 실행하면, 조건을 만족하는 3세대 개체(A)의 ID를 조회하고 정렬한다.

2-2-3. 최종 쿼리

SELECT A.ID FROM ECOLI_DATA A JOIN ECOLI_DATA B ON A.PARENT_ID = B.ID JOIN ECOLI_DATA C ON B.PARENT_ID = C.ID WHERE C.PARENT_ID IS NULL ORDER BY A.ID;
📌
해당 코드를 실행하면,
  • 루트(C) → 자식(B) → 손자(A) 구조에서
  • 3세대 개체(A)만 추출하여
  • ID 기준으로 정렬한다.