SQL

프로그래머스 SQL 오답노트 Level 3 업그레이드 할 수 없는 아이템 구하기

datahaseo 2025. 10. 16. 09:08

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

 

<문제>

더 이상 업그레이드할 수 없는 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬해 주세요.

 

 

 

<틀렸던 이유>

 

1. 문제 요구에 대한 정확한 이해 필요

내가 필요로 한 것은 업그레이드를 할 수 없는 아이템들

문제에 따르면 업그레이드를 할 수 있었던 아이템들은 모두 PARENT_ITEM_ID 가 존재함

즉 PARENT_ITEM_ID 에 ID 가 없거나 NULL 이라면 아이템을 업그레이드 할 수 없었던 것 

 

접근 방법은

(1) 업그레이드 할 수 있었던 ITEM_ ID 들, 즉 PARENT_ITEM_ID 에 ID 가 존재한 항목들을 서브 쿼리로 추출

 

 

(2) 필터링 할 때  ITEM_ID 에서 업그레이드 할 수 있던 ID 들의 여집합을 구한다 즉, NOT IN

 

 

IN 조건일 때 결과

 

NOT IN 조건일 때 결과

 

 

 

2.  IS NOT NULL 조건 누락

(SELECT PARENT_ITEM_ID FROM ITEM_TREE WHERE PARENT_ITEM_ID IS NOT NULL )

> (SELECT PARENT_ITEM_ID FROM ITEM_TREE WHERE PARENT_ITEM_ID)

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

 

왜 IS NOT NULL 이 필요할까?

ITEM_INFO 와 ITEM_TREE 테이블은  다음과 같음

PARENT_ID 0을 업그레이드 해서 [1] 와 [2] 가 나왔고

PARENT_ID  1을 업그레이드 해서 [3] 과 [4] 가 나왔음 

이떄 PARENT_ID 가 NULL 인 것은 ROOT 항목 이므로 어떤 값에서 업그레이드 된게 아님

따라서 이후에 제외 처리 해줘야함

 

 

 

 

 

 

<정답 쿼리>

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