본문 바로가기

코딩일기

SQL 코드카타 113 - Employees Whose Manager Left the Company

https://leetcode.com/problems/employees-whose-manager-left-the-company/description/

 

Colum Name Type
employee_id int
name varchar
manager_id int
salary int

 

Employees 테이블:

  • employee_id : 테이블의 고유 키
  • name : 이메일주소
  • manager_id : 직원의 매니저 ID, 매니저가 없는 직원의 경우 null
  • salary : 급여

다음 조건을 만족하는 직원들의 ID를 찾아야 합니다:

  1. 급여가 $30,000 미만인 직원.
  2. 매니저가 회사를 떠난 직원. 매니저가 회사를 떠나면, 매니저의 정보는 Employees 테이블에서 삭제되지만, 해당 직원들의 manager_id는 여전히 떠난 매니저의 ID로 설정됩니다.

결과 테이블은 employee_id를 기준으로 정렬하여 반환하세요.

 

select *
from Employees E1
left join Employees E2 on E1.manager_id = E2.employee_id

 

먼저 주어진 테이블을 자체결합해서 manager_id가 employee_id에 없는 데이터를 찾는다. 퇴사자는 employee_id에서 삭제처리 되기 때문이다.

 

select *
from Employees E1
left join Employees E2 on E1.manager_id = E2.employee_id
where E2.employee_id is null and E1.salary <= 30000

 

where구문을 통해서 급여가 30000이하인 직원과 E2.employee_id가 없는 직원(즉, 매니저가 없는 직원)을 필터링한다.

 

select E1.employee_id
from Employees E1
left join Employees E2 on E1.manager_id = E2.employee_id
where E2.employee_id is null and E1.salary <= 30000

 

그리고 조건에 따라 직원의 아이디만 출력하도록 하면 성공이라고 생각했는데 제출해보니 정답이 아니었다.

문제를 더 살펴보니 아무래도 현재 매니저가 없는 직원이 아니라 매니저가 있었지만 퇴사한 상태인 직원을 찾아야하는 것이었다. 즉, 처음부터 매니저가 없는 직원은 포함되지 않아야한다.

 

select E1.employee_id
from Employees E1
left join Employees E2 on E1.manager_id = E2.employee_id
where E2.employee_id is null and E1.salary < 30000 and E1.manager_id is not null

 

where구문에 조건을 하나 더 추가했다. E1. manager_id가 null이 아닌 직원(즉, 매니저가 있는 직원)을 추가로 지정해준다.

추가로, 월급이 30000이하가 아니라 미만인 직원을 찾아야하기때문에 부등호도 수정해주었다.

따라서 매니저가 있는 직원중, 지금은 그 매니저가 회사를 떠났고, 월급이 30000미만인 직원만 골라낸 후, 그 직원의 아이디를 출력해주었다.

 

select E1.employee_id
from Employees E1
left join Employees E2 on E1.manager_id = E2.employee_id
where E2.employee_id is null and E1.salary < 30000 and E1.manager_id is not null
order by E1.employee_id

 

마지막으로 오름차순으로 정렬만 하면 완료!

 

완료!