코드설명
LEFT OUTER JOIN + SCALAR SUBQUERY를 활용합니다.
문제를 보면, LEFT OUTER JOIN이라는 것은 알 수 있습니다. Employees E는 모든 레코드를 출력하고, EmployeeUNI는 일치하는 데이터만 출력하는 것이 문제이니까요.
단순하게 LEFT OUTER JOIN을 사용할경우의 문제점이 존재하기에, Scalar Subquery를 활용해봅니다.
스칼라 서브쿼리를 활용할경우의 장점은, 입력값에 대해 캐싱되어서 반복적 입력이 주어졌을때는 매우 좋습니다. 또, 함수를 사용할시 이렇게 사용하면 효율적이겠지요.
스칼라서브쿼리의 부작용은, 위의 장점과 반대인 캐시공간 부족입니다. 그렇기에, 메인쿼리의 데이터 종류가매우 많다면, 크게 효과가 없습니다. Employee의 경우, E.ID가 레코드 하나하나 다르므로, 크게 효과가 없음을 알 수 있습니다. 불필요한 캐시탐색도 일어납니다. 그대신 만약, 최근 1개월간 수백명으로 고정시킨다면 훨씬 효과적이겠지요.
또, 메인쿼리 집합이 매우 작은경우도 성능이 떨어집니다. 쿼리가 캐싱되었는데, 캐시에서 데이터를 안가져오는 경우입니다.
그러므로, 이러한 점들을 모두 고려하여 작성해야 합니다.
MYSQL 코드
LEFT OUTER JOIN을 활용한 정답코드1입니다.
SELECT EU.UNIQUE_ID, E.NAME FROM EMPLOYEES E LEFT OUTER JOIN EMPLOYEEUNI EU ON E.ID = EU.ID;
Scalar Subquery 를 활용한 정답코드2입니다.
SELECT (SELECT UNIQUE_ID FROM EMPLOYEEUNI WHERE ID = E.ID) AS UNIQUE_ID, E.NAME AS name FROM EMPLOYEES E