코딩 테스트/sql

[SQL] 대장균들의 자식의 수 구하기 풀이

so5663 2024. 11. 2. 11:41

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

나의 풀이

SELECT
  ed.id
  ,COALESCE(child_counts.cnt, 0) AS CHILD_COUNT 
  FROM ECOLI_DATA ed 
  LEFT JOIN ( 
    SELECT 
    	parent_id
        ,COUNT(*) AS cnt 
      FROM ECOLI_DATA 
      WHERE parent_id IS NOT NULL 
      GROUP BY parent_id 
     ) AS child_counts 
   ON ed.id = child_counts.parent_id 
   ORDER BY ed.id;

뭐가 불필요한 서브 쿼리가 있는 것 같아서 구글링을 해서 조금더 나은 쿼리를 짜보았다.

 

 

더욱 효율적인 쿼리

다음은 COALESCE와 LEFT JOIN을 활용하면서도 서브쿼리를 최대한 간소화한 쿼리입니다:

 
SELECT 
  ed.id
  ,COUNT(ec.id) AS CHILD_COUNT 
FROM ECOLI_DATA ed 
LEFT JOIN ECOLI_DATA ec 
ON ec.parent_id = ed.id 
GROUP BY ed.id 
ORDER BY ed.id;

최종 결과

이 쿼리는 각 id에 대해 해당하는 자식의 수를 CHILD_COUNT로 반환합니다.

자식이 없는 경우에도 COUNT가 0을 반환하기 때문에 별도의 COALESCE 함수를 사용할 필요가 없습니다.

이러한 방식은 쿼리의 효율성을 높이면서도 간단하고 직관적인 구조를 유지합니다. 이 방법은 특히 데이터 양이 많을 때 더 빠르게 실행될 수 있습니다.