Employee
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| employee_id | int |
| department_id | int |
| primary_flag | varchar |
+---------------+---------+
(employee_id, department_id)는 이 테이블의 기본 키(고유 값을 가진 열의 조합)입니다.
employee_id는 직원의 ID입니다.
department_id는 직원이 속한 부서의 ID입니다.
primary_flag는 유형('Y', 'N')의 ENUM(카테고리)입니다. 플래그가 'Y'이면 해당 부서가 직원의 기본 부서입니다. 플래그가 'N'이면 해당 부서가 기본 부서가 아닙니다.
직원은 여러 부서에 소속될 수 있습니다. 직원이 다른 부서에 합류할 때는 어느 부서가 기본 부서인지 결정해야 합니다. 직원이 한 부서에만 소속된 경우 기본 열은 'N'입니다.
모든 직원의 기본 부서를 보고하는 솔루션을 작성합니다. 한 부서에 소속된 직원의 경우, 자신의 유일한 부서만 보고합니다.
결과 테이블을 임의의 순서로 반환합니다.
-- 이중 중첩 쿼리 사용으로 비효율적인 문제 풀이... -- 하지만 각 구간별 모든 조건 분기 처리함으로 정확도가 높음 -- 인덱스 활용 가능성이 있는 쿼리문 (OR 연산은 인덱스 사용이 떨어짐) WITH RETURN_TB AS ( -- 직원 별 소속 부서 count 계산 WITH TMP_TB AS ( SELECT employee_id , COUNT(employee_id) AS CNT FROM Employee GROUP BY employee_id ) SELECT A.employee_id , CASE WHEN B.CNT = 1 THEN A.department_id WHEN B.CNT > 1 AND A.primary_flag = 'Y' THEN A.department_id ELSE 0 END AS department_id FROM Employee A JOIN TMP_TB B ON A.employee_id = B.employee_id GROUP BY A.employee_id, department_id ) SELECT employee_id , department_id FROM RETURN_TB WHERE department_id != 0 ; -- 다시 풀어본 문제 풀이 WITH TMP_TB AS ( SELECT employee_id FROM Employee GROUP BY employee_id HAVING COUNT(employee_id) = 1 ) SELECT employee_id , department_id FROM Employee WHERE 1=1 AND primary_flag = 'Y' OR employee_id IN (SELECT employee_id FROM TMP_TB) ; -- 다시 풀어본 문제 풀이 2 with tmp_tb as ( select employee_id from Employee group by employee_id having count(employee_id) = 1 ) select E.employee_id , E.department_id from Employee E left join tmp_tb T on E.employee_id = T.employee_id where T.employee_id is not null or E.primary_flag = 'Y' ;