[프로그래머스/MYSQL] 업그레이드 된 아이템 구하기, 업그레이드 할 수 없는 아이템 구하기

NOO·2024년 4월 4일
0

CODING TEST - SQL

목록 보기
1/5
post-thumbnail

👋😊 인사

안녕하세요.
요즘 코딩테스트도 열심히 공부 중입니다.

최근에 새로운 문제 올라왔던데 한 번 풀어보겠습니다.

📍 업그레이드 된 아이템 구하기

🔗 문제 링크

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

🛠️ 문제 풀이

문제의 주안점은 "모든 다음 업그레이드 아이템의 아이템" 입니다.
문제 풀이 과정은 다음과 같이 세웠습니다.

  1. ITEM_INFO 테이블에서 희귀도가 'RARE'인 아이템 조회
  2. ITEM_INFO 테이블과 ITEM_TREE를 JOIN해서 부모 아이템이 RARE인 아이템의 정보 출력

👾 소스 코드

SELECT INFO.ITEM_ID
        ,ITEM_NAME
        ,RARITY
FROM ITEM_INFO INFO LEFT OUTER JOIN ITEM_TREE TREE
    ON INFO.ITEM_ID = TREE.ITEM_ID
WHERE PARENT_ITEM_ID IN (
                            SELECT ITEM_ID
                            FROM ITEM_INFO
                            WHERE RARITY = 'RARE'
                        )
ORDER BY 1 DESC;

📍 업그레이드 할 수 없는 아이템 구하기

🔗 문제 링크

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 DISTINCT(PARENT_ITEM_ID)
                    FROM ITEM_TREE
                    WHERE PARENT_ITEM_ID IS NOT NULL
                )
ORDER BY 1 DESC;
SELECT ITEM_ID
        ,ITEM_NAME
        ,RARITY
FROM ITEM_INFO 
WHERE ITEM_ID NOT IN (
                    SELECT DISTINCT(PARENT_ITEM_ID)
                    FROM ITEM_TREE
                )
ORDER BY 1 DESC;

두 코드의 차이가 보이나요?

단 한 줄의 차이로,

결과값이 달라집니다.

1번 코드에는 부모 아이템 ID의 IS NOT NULL 연산이 있습니다.
어차피 NULL인 값은 NOT IN을 통해서 걸러질거라 생각하시나요?

No....

Null은 IS NULL 혹은 IS NOT NULL과 같은 NULL 연산을 써야 기댓값을 얻을 수 있습니다.
IN이나 NOT IN은 =, <> 연산으로 Row를 비교하기 때문에 원하는 기댓값을 얻을 수 없습니다.
그래서, NOT IN은 각 <> 연산이 AND 연산으로 이루어져 있기 때문에, 조건 전체가 false가 되므로 아무 Row도 나오지 않게 됩니다.

👾 소스 코드

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 1 DESC;

🌅 마무리

🤔 어떤 문제가 있었나요?

서브쿼리 작성 시 NOT IN 연산함에 있어 결과가 나오지 않는 문제에 마주쳤습니다.

🤔 어떻게 해결했고 무엇을 알았나요?

서브쿼리에 IS NOT NULL 을 추가하여 NULL 값 배제함으로써 NOT IN 연산이 알맞게 수행되게끔 수정하였습니다
NOT IN연산이 <> 연산으로 Row를 비교한다는 것을 상기시켰습니다.

👋😊 인사

부족한 글 읽어주셔서 감사합니다.
잘못된 부분 혹은 개선할만한 부분에 대한 댓글 항상 환영합니다.

profile
ᐕ) ⁾⁾

0개의 댓글