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

kiki·2024년 2월 29일
1

프로그래머스

목록 보기
73/79

문제 링크

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

문제 설명

더이상 업그레이드 할 수 없는 아이템 조회하기

1차 시도 - 실패

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절이 있어야 한다는 것.

2차 시도 - 통과

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해줘야하는 것이다.
참고 블로그

정리

  • NOT IN: not in은 and 연산을 진행하므로 이를 고려해 null값은 제거 후 not in 연산을 해야한다.

0개의 댓글