문제


정답
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