https://leetcode.com/problems/employee-bonus/description/?envType=study-plan-v2&envId=top-sql-50

코드설명

LEFT OUTER JOIN + IS NULL을 활용합니다.

 

LEFT OUTER JOIN 대신에 SCALAR SUBQUERY를 사용하고 싶어서, 다른 풀이를 작성했습니다만,

SELECT E.NAME AS name
        , (SELECT B.BONUS 
            FROM BONUS B
            WHERE B.EMPID = E.EMPID
            AND B.BONUS < 1000) AS bonus
FROM EMPLOYEE E

BONUS가 >=1000 이상이면 아예 나오지 않아야 하지만, SCALAR SUBQUERY 이기에 NULL이 나오게 됩니다.

 

이를 억지로 풀려고한다면, 아래와 같이 작성이 가능합니다. 이 방식의 경우 장점으로는 부분범위 처리가 가능하다는 유일한 장점이 있습니다. (TABLE을 4번방문한다는점을 유의합니다.)

WHERE절로, BONUS 1000원 이하인 레코드 값이 존재하는 경우, 존재하지 않는경우 이미 필터링한후에 SCALAR SUBQUERY를 작동시키는 방식입니다. 

SELECT E.NAME AS name,
       (SELECT B.BONUS 
        FROM BONUS B
        WHERE B.EMPID = E.EMPID) AS bonus
FROM EMPLOYEE E
WHERE EXISTS (SELECT 'X'
       FROM BONUS B
       WHERE B.EMPID = E.EMPID
       AND B.BONUS< 1000)
   OR NOT EXISTS (
       SELECT 'X' 
       FROM BONUS B
       WHERE B.EMPID = E.EMPID);

 

MYSQL 코드

LEFT OUTER JOIN을 활용한 정답코드1입니다.

SELECT E.NAME AS name, B.BONUS AS bonus
FROM EMPLOYEE E
LEFT OUTER JOIN BONUS B
ON E.EMPID = B.EMPID
WHERE B.EMPID IS NULL OR B.BONUS < 1000;

 

+ Recent posts