[프로그래머스] SQL/오답 노트

[lv3] 업그레이드 할 수 없는 아이템 구하기

SH3542 2024. 10. 5. 21:42

https://school.programmers.co.kr/learn/courses/30/lessons/273712

SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (SELECT PARENT_ITEM_ID
                      FROM ITEM_TREE)
ORDER BY ITEM_ID DESC

 

 

NOT IN (NULL) 조건식은, NULL의 비교는 UNKNOWN이므로 NULL을 반환한다.

이는 WHERE절 조건식을 항상 FALSE로 만들게 되므로, 아무 결과도 조회되지 않는다.

이후 값의 범위에 포함이 되지 않는 -1로 예외 처리하였다.

 

오답을 받으며 떠오른 내용이 있다.
IN(NULL, A)의 경우에는 A에 포함 되면 TRUE지만, NOT IN(NULL, A)은 무조건 FALSE임에 특히 주의해야 한다고 하셨었다.

IN(FALSE, TRUE) => TRUE
NOT IN(FALSE, TRUE) => FALSE

 

수정

SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (SELECT IFNULL(PARENT_ITEM_ID, -1)
                      FROM ITEM_TREE)
ORDER BY ITEM_ID DESC