https://www.hackerrank.com/challenges/the-company/problem?isFullScreen=true
코드설명
INNER JOIN + DISTINCT 를 활용합니다.
상당히 좋은 문제라고 생각이 들었습니다.
먼저 아래의 정답코드1을 보면, 계층적으로 INNER JOIN을 통해 각 매니저들과 사원들을 연결시켰습니다.
그런데, 이때 만약 DISTINCT 없이 COUNT만 한다면 어떻게 될까요?
모든 값이 똑같게 나옵니다. 이유는, 결국 레코드라는 것은 카타시안 곱으로 이루어져있기 때문에
만약 LEAD MANGER가 3명이고, SENIOR_MANGER가 2명일때 만약 각각 연결되어있다고 가정할시 총 6가지가 나옵니다.
L1 - (S1, S2)
L2 - (S1, S2)
L3 - (S1, S2)
이런식으로 총 6개가 됩니다.
이때 레코드 또한 6개이지요.
그렇기 때문에 우리는 DISTINCT를 사용해야만 중복된 것들을 제거할 수 있습니다.
코드
정답코드1입니다.
SELECT C.COMPANY_CODE, C.FOUNDER, COUNT(DISTINCT LM.LEAD_MANAGER_CODE), COUNT(DISTINCT SM.SENIOR_MANAGER_CODE), COUNT(DISTINCT M.MANAGER_CODE), COUNT(DISTINCT E.EMPLOYEE_CODE)
FROM COMPANY C
INNER JOIN LEAD_MANAGER LM
ON C.COMPANY_CODE = LM.COMPANY_CODE
INNER JOIN SENIOR_MANAGER SM
ON LM.LEAD_MANAGER_CODE = SM.LEAD_MANAGER_CODE
INNER JOIN MANAGER M
ON SM.SENIOR_MANAGER_CODE = M.SENIOR_MANAGER_CODE
INNER JOIN EMPLOYEE E
ON M.MANAGER_CODE = E.MANAGER_CODE
GROUP BY C.COMPANY_CODE, C.FOUNDER
ORDER BY C.COMPANY_CODE ASC;
만약 위의 코드와 다르게 COMPANY_CODE로만 해도 가능한 것 아니야? 라는 생각이 듭니다.
물론 그렇게해도 값은 동일하게 나옵니다. 이유는 결국 같은 회사이니까요.
하지만, 그렇게 할경우 훨씬 더 많은 경우의 레코드가 나오며 성능적으로 더 좋지 않겠죠.