[Mysql] Subquery 실전 2

Alex of the year 2020 & 2021·2020년 12월 26일
1

Mysql

목록 보기
12/13
post-thumbnail

(해당 포스트는 Inflearn - [백문이불여일타] 데이터 분석을 위한 고급 SQL 강의록입니다.)

LeetCode

184. Department Highest Salary요약하면 Employee 테이블에서 가장 많은 연봉을 받는 사람의 부서명, 이름, 연봉을 구하는 문제이다. (Employee테이블은 Department테이블을 FK로 물고 있다.)

나의 풀이

select dept.Name as Department, sub.Name as Employee, sub.sal as Salary 
from (select DepartmentId, Name, max(Salary) as sal
      from Employee
      group by DepartmentId) as sub
join Department as dept
on sub.DepartmentId = dept.Id;

까지 적었으나 Wrong Answer.
이유는 서브쿼리 속의 group by 사용이 잘못되어 서브쿼리부터 원하는 값이 출력되지 못했기 때문이다. 내가 작성한 서브쿼리만으로 쿼리를 찍어보면, 현재 IT부서에서 가장 높은 샐러리는 Max와 Jim이 받고 있음에도 이름에는 Joe가 출력되었다.

해설 답안

select dept.name as Department, main.name as Employee, main.salary as Salary
from employee as main
#❗️❗️첫번째 inner join❗️❗️
inner join (select departmentid, max(salary) as max_salary
            from employee
            group by departmentid) as sub  
on main.departmentid = sub.departmentid and main.salary = sub.max_salary
# 두번째 inner join
inner join department as dept 
on dept.id = main.departmentid

문제를 너무 쉽게 생각했던 것 같다.
해결을 위해서는 두 번의 inner join이 필요했는데, 두번째 inner join은 FK로 물려있는 정보를 끌어다 쓰기위해서는 당연히 생각해낼 수 있었지만, 첫번째 inner join의 on 조건이 위에서 보는바와 같이 and로 연산해야해서 다소 까다로웠다.
main 쿼리와 departmentid가 같으며 첫번째 서브쿼리에서 max_salary로 쿼리된 부분이 메인 쿼리의 salary에 해당하는 그 row만 데려와야 내가 처음에 시도했던 것처럼 최고연봉과 최고연봉 수령자의 이름이 불합치되는 경우를 면할 수 있다.

후~! 꽤나 어려운 문제였다.

profile
Backend 개발 학습 아카이빙 블로그입니다. (현재는 작성하지 않습니다.)

0개의 댓글