문제


정답
SELECT A.ID, COALESCE(B.COUNT, 0) AS CHILD_COUNT FROM ECOLI_DATA AS A
LEFT JOIN (SELECT PARENT_ID, COUNT(*) AS COUNT FROM ECOLI_DATA
GROUP BY PARENT_ID
HAVING PARENT_ID IS NOT NULL) AS B
ON A.ID = B.PARENT_ID
ORDER BY ID;
1. 서브쿼리
서브쿼리는
PARENT_ID
가 존재하는 레코드들을 그룹화하고, 각 PARENT_ID
에 대해 자식 레코드의 수를 계산합니다.(SELECT PARENT_ID, COUNT(*) AS COUNT FROM ECOLI_DATA GROUP BY PARENT_ID HAVING PARENT_ID IS NOT NULL) AS B
SELECT PARENT_ID, COUNT(*) AS COUNT
:PARENT_ID
와 그PARENT_ID
를 가진 레코드의 수를 선택합니다.
FROM ECOLI_DATA
:ECOLI_DATA
테이블에서 데이터를 가져옵니다.
GROUP BY PARENT_ID
:PARENT_ID
별로 그룹화합니다.
HAVING PARENT_ID IS NOT NULL
:PARENT_ID
가NULL
이 아닌 그룹만 선택합니다.
AS B
: 서브쿼리의 결과를B
라는 별칭으로 사용합니다.
2. 외부 쿼리
외부 쿼리는 기본 테이블인
ECOLI_DATA
와 서브쿼리의 결과를 LEFT JOIN하여 최종 결과를 반환합니다.SELECT A.ID, COALESCE(B.COUNT, 0) AS CHILD_COUNT
FROM ECOLI_DATA AS A
LEFT JOIN ( ... ) AS B
ON A.ID = B.PARENT_ID
ORDER BY ID;
SELECT A.ID, COALESCE(B.COUNT, 0) AS CHILD_COUNT
:A.ID
: 기본 테이블ECOLI_DATA
의ID
를 선택합니다.COALESCE(B.COUNT, 0) AS CHILD_COUNT
: 서브쿼리에서 계산된 자식 레코드 수(COUNT
)를 선택합니다. 만약COUNT
가NULL
이면0
으로 반환합니다.
FROM ECOLI_DATA AS A
:ECOLI_DATA
테이블을A
라는 별칭으로 사용합니다.
LEFT JOIN
: 기본 테이블A
와 서브쿼리 결과B
를 LEFT JOIN 합니다.
ON A.ID = B.PARENT_ID
:A.ID
와B.PARENT_ID
가 일치하는 레코드를 조인합니다.
ORDER BY ID
: 결과를ID
기준으로 정렬합니다.
Share article