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