SQL/[프로그래머스]

[LEVEL 3] 대장균들의 자식의 수 구하기

hyunnn_00 2024. 4. 2. 14:16

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

 

프로그래머스

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

programmers.co.kr

 

 

나의 풀이

1. T1 테이블을 만들어 PARENT_ID별로 자식 수를 COUNT하여 CNT 컬럼을 생성한다.

2. ECOLI_DATA와 T1 테이블을 LEFT JOIN 하는데, 여기서 포인트는 T1의 PARENT_ID와 ECOLI_DATA의 ID를 기준으로 조인하는 것 (이거떄메 20분 헤맴)

3. CASE WHEN 구문 이용해서 CNT 컬럼이 NULL 값이면 0값 지정

WITH T1 AS (
    SELECT PARENT_ID, COUNT(*) AS CNT
    FROM ECOLI_DATA
    GROUP BY PARENT_ID
)

SELECT 
    ECOLI_DATA.ID,
    CASE WHEN CNT IS NOT NULL THEN CNT
         ELSE 0 END AS CHILD_COUNT
FROM ECOLI_DATA
    LEFT JOIN T1 ON T1.PARENT_ID = ECOLI_DATA.ID
ORDER BY ID

 

다른 사람 풀이

SELECT
    PARENT.ID,
    COUNT(CHILD.ID) AS CHILD_COUNT
FROM
    ECOLI_DATA AS PARENT
LEFT OUTER JOIN
    ECOLI_DATA AS CHILD ON PARENT.ID = CHILD.PARENT_ID
GROUP BY
    PARENT.ID
ORDER BY
    PARENT.ID

1. 자식이 없는 경우까지 포함하기 위해 inner join이 아닌 outer join 수행

    ㄴ 이 경우, 자식이 없는 row의 child_id는 NULL

2. COUNT(*)를 이용하면 자식이 없는 row도 CHILD_COUNT의 값이 1로 나타남

    ㄴ 따라서 COUNT(CHILD.ID) 로 지정

 

이 풀이는 처음에 헷갈렸는데, 동일 테이블을 JOIN한 예시였다. 오랜만에 봐서 기억이 안났다..  

 

다른사람 풀이2

SELECT  ID,
         (SELECT COUNT(ID) FROM ECOLI_DATA WHERE PARENT_ID = ED.ID) AS CHILD_COUNT
 FROM    ECOLI_DATA ED
 ORDER BY ID ASC