본문 바로가기
SQL/코딩테스트

[MySQL] Self Join

by Nanki 2024. 11. 5.

Self Join은 아래와 같은 상황에 쓰였다.

 

1. 같은 테이블에서 행끼리의 어떤 비교가 이루어질 때

2. 아래와 같이 하나의 테이블에 두개 이상의 key ID가 들어있고, 이 두 키를 이용해서 문제를 풀어야 할 때 Self Join을 이용해야한다.

 

문제 : id(종업원)와 종업원 담당 mangerId(매니저)의 급여를 비교하고 매니저보다 급여가 큰 종업원의 이름을 출력하시오.

 

데이터

Employee table:
+----+-------+--------+-----------+
| id | name  | salary | managerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | Null      |
| 4  | Max   | 90000  | Null      |
+----+-------+--------+-----------+

 

풀이 매크로

1. 담당 매니저가 있는 값들 만 추린다 : INNER JOIN 활용

2. Employee 테이블 두개를 1을 통해 붙인 후 각 salary별로 비교한다.

 

Self INNER JOIN 작성시 주의사항

SELECT E1.id
        ,E1.NAME AS "Employee_Name"
       ,E1.Salary AS "Employee_Salary"
       ,E2.NAME AS "manager_Name"
       ,E2.Salary AS "manager_Salary"
FROM Employee AS E1
    INNER JOIN Employee AS E2
/* 1번 */
    ON E1.managerId = E2.Id /* E2테이블을 매니저테이블이라 가정하고 E1의 매니저 키로 붙이겠다 */
/* 2번 */
    ON E1.Id = E2.managerId /* E2테이블을 종업원테이블이라 가정하고 E1의 종업원 키로 붙이겠다 */

1번) 아래는 ON E1.managerId = E2.Id 를 진행한 형태다. 

| Id | Employee_Name | Employee_Salary | manager_Name | manager_Salary |
| -- | ------------- | --------------- | ------------ | -------------- |
| 1  | Joe           | 70000           | Sam          | 60000          |
| 2  | Henry         | 80000           | Max          | 90000          |

 

2번) 아래는 ON E1.Id = E2.managerId 

| Id | Employee_Name | Employee_Salary | manager_Name | manager_Salary |
| -- | ------------- | --------------- | ------------ | -------------- |
| 3  | Sam           | 60000           | Joe          | 70000          |
| 4  | Max           | 90000           | Henry        | 80000          |

 

이때 테이블 자체로는 같지만, 구분을 위해 변수이름을 주었을 때 위처럼 혼란을 야기할 수 있다.

Self로 테이블 결합시 E2를 매니저 테이블이라 정의했다면, 1번처럼 E1에서 매니저 키를 기준으로 테이블을 붙여야 한다.

 

최종코드

SELECT E1.NAME AS "Employee"
FROM Employee AS E1
    INNER JOIN Employee AS E2
    ON E1.managerId = E2.Id
WHERE E1.Salary > E2.Salary
;

 

문제 출처 : https://leetcode.com/problems/employees-earning-more-than-their-managers/