[Mysql] NOT IN 문제
⛔ Null과 NOT IN
SQL 문제를 풀면서 NOT IN을 사용했는데, 원하는 대로 조회가 되지 않았던 문제가 발생했다.
아래 코드는 프로그래머스의 SQL문제이다.
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (
SELECT DISTINCT(PARENT_ITEM_ID)
FROM ITEM_TREE
)
ORDER BY ITEM_ID DESC;
결과
ITEM_ID | ITEM_NAME | RARITY |
---|---|---|
❓ 문제와 문제 좁히기
PARENT_ITEM_ID
에 속하지 않는 ITEM_ID
를 찾으려고 NOT IN
을 사용했으나, 아무것도 출력되지 않았다.
그래서 원인을 찾고자 NOT IN에서 NOT
을 제거해봤다.
결과적으로 IN은 아래처럼 제대로 실행되었고, NOT IN
을 사용하면서 문제가 생긴 것을 알 수 있었다.
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID IN (
SELECT DISTINCT(PARENT_ITEM_ID)
FROM ITEM_TREE
)
ORDER BY ITEM_ID DESC;
결과
ITEM_ID | ITEM_NAME | RARITY |
---|---|---|
1 | ITEM_B | RARE |
0 | ITEM_A | RARE |
⚠️ 원인
그래서 이 문제의 해결책을 찾고자 검색해보니,
NOT IN
색인 과정에서 NULL
과 비교하는 순간,
이게 NULL에 포함되는 값인지, 포함되지 않는 값인지 모른다는 식으로 처리가 된다고 한다.
그래서 IN
이 처리된 이유를 검색해보니,
IN
만 사용을 했을 때는 정확하게 일치하는 값이 있었기 때문에 문제가 없었지만,
NOT IN
을 사용했을 때는 매치되는 값도 없고, 그렇다고 매치가 되는지 안되는지도 모르는 NULL
이 들어있었기 때문에 처리되지 않은 것이다.
앞으로는 Null값을 생각하면서 SQL문을 작성해야겠다.
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (
SELECT DISTINCT(PARENT_ITEM_ID)
FROM ITEM_TREE
WHERE PARENT_ITEM_ID IS NOT NULL
)
ORDER BY ITEM_ID DESC;
This post is licensed under CC BY 4.0 by the author.