
풀긴 풀었는데요.. 굉장히 더러운 쿼리인 것 같아요.
저의 답 쿼리입니다.
(
SELECT DISTINCT SALARY SecondHighestSalary
FROM (
SELECT DENSE_RANK() OVER (ORDER BY SALARY DESC) DR
, SALARY
FROM EMPLOYEE
) AS T
WHERE DR = 2
)
UNION ALL
(
SELECT DISTINCT NULL SecondHighestSalary
FROM EMPLOYEE
WHERE (SELECT COUNT(DISTINCT SALARY) FROM EMPLOYEE) = 1
)
select
(select distinct Salary
from Employee order by salary desc
limit 1 offset 1)
as SecondHighestSalary;
첫 번째 쿼리를 보고 굳이 서브쿼리로 해야하나 싶어서 서브쿼리 안에 있는 쿼리로만 돌려봤는데 NULL값이 안나오더라고요. GPT는 위의 쿼리가 NULL값을 반환하는 이유를 "주 쿼리가 서브쿼리의 결과에 의존하기 때문에 발생"한다고 설명하네요. 서브쿼리를 이용하여 결과를 도출하면 NULL값을 반환할 수 있다?로 이해하면 될 것 같습니다..
SELECT MAX(SALARY) AS SecondHighestSalary
FROM EMPLOYEE
WHERE SALARY != (SELECT MAX(SALARY) FROM EMPLOYEE);
두 번째 쿼리도 위와 같은 이유로 NULL값을 반환하는 것 같아요.
일단 가장 큰 급여를 제외한 나머지 급여 중에서 가장 큰 급여를 추출하는 형식인데 그 값이 없다면 NULL을 반환합니다.
SELECT
IFNULL(
(SELECT DISTINCT Salary
FROM Employee
ORDER BY Salary DESC
LIMIT 1 OFFSET 1),
NULL) AS SecondHighestSalary
IFNULL() 구문은 익숙하지않아서 사용할 생각을 못했었습니다.
생각해보면 이 문제에 적합한 구문인 것 같더라고요.
서브쿼리로 쓰인 부분이 NULL이 아니면 그 값을 출력하고 NULL값이라면 NULL를 출력하는 형식입니다.
리트코드 medium 문제는 생각할 것들이 많은 문제들이네요!!