240913 TIL

mj_data·2024년 9월 13일

TIL

목록 보기
10/32

SQL 문제 정답 비교

정답

SELECT
	   e1.Name,
	   e1.Department,
	   e1.Salary,
	   e2.Name Top_Earner,
	   e2.Salary Top_Salary
FROM
	Employees e1
JOIN Employees e2 ON
	e1.Department = e2.Department
WHERE
	e2.Salary = (
	SELECT
		max(Salary)
	FROM
		Employees e3
	WHERE
		e3.Department = e1.Department
		)

아무리 봐도 이해가 완벽히 되지않아 GPT와 대화를 나누며 하나하나 파악해봤다.

  1. e1과 e2를 Department 기준으로 INNER JOIN을 하는데, 저렇게 되면 부서가 겹치는 인원들에 대해 모든 조합이 튀어나온다. 예시는 아래와 같다.

  2. 그 뒤 WHERE절을 통하여 각 부서별 최대 Salary들과 일치하는 값들로 선택해준다. 그 결과 e2에서는 부서가 겹치는 인원들에 대한 모든 조합 중 Salary가 최대인 값들인 조합들만 생존하게 된다. 예시는 아래와 같다

  3. 그 뒤는 필요한 컬럼들만 골라서 이름을 지정해준 것이다.

막상 설명을 보면 그렇구나 싶은데, 문제를 풀 때 INNER JOIN을 통해 모든 조합을 생성하는 부분을 생각하기가 쉽지 않았던 것 같다.

내 답

SELECT
	e.Name,
	e.Department,
	e.Salary,
	b.Name Top_Earner,
	maxSalary Top_Salary
FROM
	Employees e
LEFT JOIN
(
	SELECT
		e.Name,
		e.Department,
		e.Salary,
		a.maxSalary
	FROM
		Employees e
	LEFT JOIN
(
		SELECT
			Department,
			max(Salary) maxSalary
		FROM
			Employees e
		GROUP BY
			1) a
ON
		e.Department = a.Department
	WHERE
		Salary = maxSalary
) b
ON
	b.Department = e.Department

예시 답안과 비교하면 무식해 보이는 답이다. 서브쿼리부터 설명하자면

  1. 서브쿼리 a에서는 각 부서별 maxSalary를 찾고
  2. 서브쿼리 b에서는 WHERE절을 통하여 최대 급여인 직원들만 e에 LEFT JOIN 했다.
  3. 최종 쿼리에서는 2의 결과를 원본테이블에 maxSalary데이터를 포함하여 Department기준으로 LEFT JOIN하였다.

0개의 댓글