• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

선생님 코드 중에 궁금한 것이 있습니다.

21.10.22 23:20 작성 조회수 90

2

문제 풀이중  HackerRank의 New Companies 문제에 대한 질문입니다 선생님 께서 작성하신 코드를 보고 혹시 left join의 on 자리에 모든 테이블에 공통되는 칼럼인 company_code로 바꿔도 같은 결과가 나오지 않을까라는 생각에 해봤더니 같은 값이 나오는 것 같았어요 

 

<선생님의 코드>  (저랑 다른부분만)

 

left join lead_manager lm on c.company_code = lm.company_code

left join senior_manager sm on lm.lead_manager_code = sm.lead_manager_code

left join manager m on sm.senior_manager_code = m.senior_manager_code

left join employee e on m.manager_code = e.manager_code

group by c.company_code,c.founder

order by c.company_code;

 

<저의 코드>

from company c 

     left join lead_manager lm on c.company_code = lm.company_code

     left join senior_manager sm on lm.company_code = sm.company_code

     left join manager m on sm.company_code = m.company_code

 

     left join employee e on m.company_code= e.company_code

 

 

궁금한점 

굳이 on에 들어갈 공통 칼럼을 다르게 해주신 이유가 있나요? 이번에 운이 좋아서 값이 나온거지  저 처럼 저렇게 1개로 다 넣으면(모든 테이블에 공통으로 존재하는 칼럼이 1개 있을 경우) 원래 안되는건가요? 

답변 1

답변을 작성해보세요.

1

구하려는 값이 무엇이냐에 따라 조인의 기준이 되는 컬럼도 달라질 수 있습니다.

이 문제는 각 직급마다 유니크한 값 개수를 구하는 것이므로, 작성해 주신 쿼리처럼 모든 조인에 company_code 컬럼을 사용하셔도 문제 없습니다. 
다만, 효율성의 측면에서 권장하지는 않습니다. 

 

Senior_Manager Table:

Manager Table:

위 두 테이블을 LEFT JOIN 할 때 company_code 컬럼을 기준으로 하면,
senior_manager_code = 'SM2'인 데이터에도 'SM1'일 때의 manager_code가 동일하게 들어가면서 더 큰 테이블이 생성되기 때문입니다. 


또한, 만약 이 문제에서 요구하는 바가 'SM2가 관리하는 manager의 코드를 출력'과 같은 것이었다면 잘못된 답을 도출하게 됩니다.