문제설명
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다.
다음은 실험실에서 배양한 대장균들의 정보를 담은 ECOLI_DATA 테이블입니다. ECOLI_DATA 테이블의 구조는 다음과 같으며, ID, PARENT_ID, SIZE_OF_COLONY, DIFFERENTIATION_DATE, GENOTYPE 은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.
최초의 대장균 개체의 PARENT_ID는 NULL 값입니다.
문제
대장균 개체의 ID(ID)와 자식의 수(CHILD_COUNT)를 출력하는 SQL 문을 작성해 주세요. 자식이 없다면 자식의 수는 0으로 출력해 주세요. 이때 결과는 개체의 ID에 대해 오름차순 정렬해 주세요.
입출력 예 & 설명
예를 들어 ECOLI_DATA 테이블이 다음과 같다면
ID 1인 개체의 자식은 ID 3으로 1개 ID 2인 개체의 자식은 ID 4,5 로 2개 ID 4인 개체의 자식은 ID 6으로 1개이며 나머지 개체들은 자식이 없으므로 ID에 대해 오름차순 정렬하면 결과는 다음과 같아야 합니다.
나의 풀이
저는 스칼라 서브쿼리를 이용하여 풀었습니다.
SQL에서 쿼리안의 쿼리를 이용하는 것을 SUB QUERY라고 부르는데, 서브 쿼리를 사용하는 위치가 SELECT절에서 사용했다면 스칼라 서브쿼리(Scalar Subquery)라고 부릅니다.
ECOLI_DATA 테이블에서 보기 쉽게 ALIAS를 PARENT와 CHILD로 주었습니다.
자식의 수를 구해야 하니깐 PARENT_ID를 SELECT문에 적어주고, Scalar Subquery로 자식의 수를 구해줍니다.
스칼라 서브쿼리의 WHERE절에서 부모의 아이디(CHILD.PARENT_ID)와 부모 자신의 아이디 (PARENT.ID)을 조건을 줘서 대장균들의 자식의 수를 구해줍니다.
다른 풀이 ✅
전체적인 맥락은 "나의 풀이"와 비슷하지만 스칼라 서브쿼리가 아닌 LEFT JOIN을 사용했습니다.
PARENT를 기준으로 부모의 아이디(CHILD.PARENT_ID)와 부모 자신의 아이디 (PARENT.ID)로 JOIN을 해주었습니다.
SELECT절에서 집계 함수 없이 나열된 칼럼 이름이나 표현식은 GROUP BY절에 반드시 포함되어야 합니다.
위와 같은 GROUP BY절의 특징 때문에 집계 함수인 COUNT(CHILD.ID)를 제외한 PARENT.ID를 GROUP BY절에 반드시 포함시켜야 합니다.
'Coding Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 연도별 대장균 크기의 편차 구하기 (MySQL) (0) | 2024.05.03 |
---|---|
[프로그래머스] 짝지어 제거하기 (JavaScript) (1) | 2024.05.03 |
[프로그래머스] 최소직사각형 (JavaScript) (0) | 2024.05.02 |
[프로그래머스] 올바른 괄호 (JavaScript) (0) | 2024.04.28 |
[프로그래머스] 3진법 뒤집기 (JavaScript) (1) | 2024.04.27 |