https://school.programmers.co.kr/learn/courses/30/lessons/273712
더이상 업그레이드 할 수 없는 아이템 조회하기
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE 1=1
AND ITEM_ID NOT IN (SELECT PARENT_ITEM_ID
FROM ITEM_TREE)
ORDER BY ITEM_ID DESC;
처음엔 이렇게 작성했었다.
parent_item_id에 있지 않는 데이터는 더이상 업그레이드를 할 수 없는 데이터임.
서브쿼리에서 전체 parent_item_id를 조회해 item_id가 이에 포함되어있지 않은 데이터를 조회하고자 함.
하지만 아무것도 조회되지 않는 문제 발생!
질문하기를 살펴보니 서브쿼리에 null값은 제외하는 where절이 있어야 한다는 것.
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (SELECT PARENT_ITEM_ID
FROM ITEM_TREE WHERE NOT ISNULL(PARENT_ITEM_ID))
ORDER BY ITEM_ID DESC;
그래서 추가해주니 통과했다!
왜 그랬냐면, IN의 경우 or 연산으로 하나라도 =의 결과가 true이면 해당 데이터가 조회되는 것인데, NOT IN의 경우 and 연산이 된다고 한다.
즉 서브쿼리에 있는 모든 데이터에 대해서 !=의 결과가 true인 데이터가 조회된다.
이 문제의 parent_item_id엔 null 값이 포함되어있어 null과 !=연산을 하는 경우 UNKNOWN(false) 값이 반환되므로 모두 조회되지 않는 것이다.
그렇기 때문에 서브쿼리에서 null은 제외하고 select해줘야하는 것이다.
참고 블로그