예전에 풀었던 방법
primary_flag = Y인 employee를 구하는 쿼리와
primary_flag = N이면서 숫자가 하나밖에 없는 (즉, primary department가 없으면서도 소속 부서가 2개 이상인 employee는 쿼리 결과에 뜨면 안됨) 경우를 구하는 쿼리를 union한 결과. 사실 이 편이 더 알아보긴 쉬울 것 같다.
SELECT employee_id,
department_id
FROM employee
GROUP BY 1
HAVING Count(*) = '1'
UNION
SELECT employee_id,
department_id
FROM employee
WHERE primary_flag = 'Y'
GROUP BY 1
오늘 풀었던 방법
WITH primary_y
AS (SELECT employee_id,
department_id
FROM employee
WHERE primary_flag = 'Y'),
primary_n
AS (SELECT e.employee_id,
e.department_id
FROM employee e
LEFT JOIN primary_y
ON e.employee_id = primary_y.employee_id
WHERE primary_y.employee_id IS NULL
GROUP BY 1
HAVING Count(*) = 1)
SELECT *
FROM primary_y
UNION
SELECT *
FROM primary_n
위에 풀었던 결과와 똑같다.
다만 primary_y와 primary_n을 CTE로 만들어 두고 본 쿼리에서는 union을 써서 두 뷰를 연결해 주기만 했다는 게 차이. 이것도 CTE 연습.
오늘은 팀프로젝트로 달려서 피곤하기도 하고
시간도 얼마 남지 않아 코드카타는 여기까지.
주말에는 다시 많은 문제를 연습해서 leetcode SQL50을 마무리해 보고 싶다.