우당탕탕 개발일지

[SQL] 프로그래머스 Select : 특정 세대의 대장균 찾기 (level 4) 본문

SQL

[SQL] 프로그래머스 Select : 특정 세대의 대장균 찾기 (level 4)

민아당긴아 2024. 6. 20. 15:42

💡문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/301650

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

💡SQL 코드 설계

1. parent_id가 null인 레코드만 모아 first_gen을 만든다. 

2. join 함수를 이용하여 parent_id가 first_gen.id와 같은 레코드만을 모아 second_gen을 만든다.

3. join 함수를 이용하여 parent_id가 second_gen.id와 같은 레코드만을 모아 출력한다. 

 

💡SQL 코드

-- 코드를 작성해주세요
with first_gen as (
    select id
    from ecoli_data
    where parent_id is null
),
second_gen as (
    select ecoli_data.id, ecoli_data.parent_id
    from ecoli_data
    join first_gen on ecoli_data.parent_id = first_gen.id
)
select ecoli_data.id
from ecoli_data
join second_gen on ecoli_data.parent_id = second_gen.id

 

💡오답 풀이

처음에는 case when ~~~ then ~~~ end as ~~~ 문 쓰면 되는줄 알았다.

parent_id가 null이면 first_generation이라는 별명을 붙여주고,
parent_id의 parent_id가 null이면 second_generation이라는 별명을 붙여주고.

근데 parent_id의 parent_id가 null인지를 어떻게 파악할지 몰라서 막혀있다가 결국 구글링했는데

내가 써본 적 없는 with문을 사용해야 한다.

WITH CTE_NAME AS (
    -- 여기에는 CTE로 정의할 하위 쿼리가 들어갑니다.
    SELECT column1, column2, ...
    FROM table_name
    WHERE conditions
)
-- 메인 쿼리에서 CTE를 사용합니다.
SELECT column1, column2, ...
FROM CTE_NAME
WHERE conditions;

이렇게 해서 계층형 쿼리를 작성하는데 사용되는 with!