Post

[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_IDITEM_NAMERARITY
   

❓ 문제와 문제 좁히기

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_IDITEM_NAMERARITY
1ITEM_BRARE
0ITEM_ARARE

⚠️ 원인

그래서 이 문제의 해결책을 찾고자 검색해보니,
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.