문제
다음과 같은 스키마를 가진 테이블 Employee가 존재한다.
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| employee_id | int |
| department_id | int |
| primary_flag | varchar |
+---------------+---------+
employee_id는 직원의 ID이고, department_id는 직원이 속한 부서의 ID이다. employee_id, department_id는 primary key이다. primary_flag는 'Y', 'N' 값을 가지는 ENUM 형 컬럼으로, Y이면 직원의 주 부서라는 의미이고, N이면 직원의 주 부서가 아니라는 의미이다.
직원은 여러 부서에 소속될 수 있으나, 어느 부서가 주 부서인지 결정해야 한다. 만약 직원이 하나의 부서에만 소속되어 있을 경우에는 primary_flag가 N이다.
이 때 모든 직원의 주 부서를 확인하는 쿼리문을 작성하라.
예시 )
Input:
Employee table:
+-------------+---------------+--------------+
| employee_id | department_id | primary_flag |
+-------------+---------------+--------------+
| 1 | 1 | N |
| 2 | 1 | Y |
| 2 | 2 | N |
| 3 | 3 | N |
| 4 | 2 | N |
| 4 | 3 | Y |
| 4 | 4 | N |
+-------------+---------------+--------------+
Output:
+-------------+---------------+
| employee_id | department_id |
+-------------+---------------+
| 1 | 1 |
| 2 | 1 |
| 3 | 3 |
| 4 | 3 |
+-------------+---------------+
풀이
처음에는 그룹 연산을 활용해서 처리하려고 했으나, 생각보다 잘 되지 않아서 UNION을 사용해 풀이했다.
풀이 방법은 다음과 같다.
1. 소속된 부서가 하나인 직원 정보 조회
SELECT employee_id
, department_id
FROM Employee
GROUP BY employee_id
HAVING COUNT(department_id) = 1
2. 여러 부서에 소속된 직원 정보 조회
SELECT employee_id
, department_id
FROM Employee
WHERE TRUE
AND primary_flag = 'Y'
3. 두 정보를 하나의 테이블로 합친다.
SELECT employee_id
, department_id
FROM Employee
GROUP BY employee_id
HAVING COUNT(department_id) = 1
UNION
SELECT employee_id
, department_id
FROM Employee
WHERE TRUE
AND primary_flag = 'Y'
다른 풀이
또는 조건절에 서브쿼리를 사용하는 방법이 존재한다.
조건절에 primary_flag가 Y이거나, employee_id가 직원 별 부서 수가 1인 employee_id에 포함되어 있는 경우를 조회하면 된다.
SELECT employee_id
, department_id
FROM Employee
WHERE TRUE
AND (primary_flag = 'Y'
OR employee_id IN (SELECT employee_id
FROM Employee
GROUP BY employee_id
HAVING COUNT(department_id) = 1
)
)
ORDER BY employee_id
참고 문서
728x90