데이터 분석

흐름을 읽고
인사이트를 만든다.

10.프로그래머스 SQL Lv.3 (업그레이드 할 수 없는 아이템 구하기)

2026. 5. 19. 11:56프로그래머스 SQL

문제 설명
어느 한 게임에서 사용되는 아이템들은 업그레이드가 가능합니다.
'ITEM_A'->'ITEM_B'와 같이 업그레이드가 가능할 때
'ITEM_A'를 'ITEM_B'의 PARENT 아이템,
PARENT 아이템이 없는 아이템을 ROOT 아이템이라고 합니다.

예를 들어 'ITEM_A'->'ITEM_B'->'ITEM_C' 와 같이 업그레이드가 가능한 아이템이 있다면
'ITEM_C'의 PARENT 아이템은 'ITEM_B'
'ITEM_B'의 PARENT 아이템은 'ITEM_A'
ROOT 아이템은 'ITEM_A'가 됩니다.

다음은 해당 게임에서 사용되는 아이템 정보를 담은 ITEM_INFO 테이블과 아이템 관계를 나타낸 ITEM_TREE 테이블입니다.

ITEM_INFO 테이블은 다음과 같으며, ITEM_ID, ITEM_NAME, RARITY, PRICE는 각각 아이템 ID, 아이템 명, 아이템의 희귀도, 아이템의 가격을 나타냅니다.

ITEM_TREE 테이블은 다음과 같으며, ITEM_ID, PARENT_ITEM_ID는 각각 아이템 ID, PARENT 아이템의 ID를 나타냅니다.

단, 각 아이템들은 오직 하나의 PARENT 아이템 ID 를 가지며, ROOT 아이템의 PARENT 아이템 ID 는 NULL 입니다.

ROOT 아이템이 없는 경우는 존재하지 않습니다.

 

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

 

문제 파악

1. 더이상 업그레이드 할 수 없다 =  어떤 아이템이 부모(PARENT_ITEM_ID) 역할을 하고 있다면, 그 아이템은 업그레이드 가능

=  PARENT_ITEM_ID 리스트에 한 번도 등장하지 않는 ITEM_ID 가 더이상 업그레이드 할 수 없는 아이템

2. 부모 아이템 ID 목록 구하기 = ITEM_TREE에서 PARENT_ITEM_ID들을 서브쿼리로 추출 (NULL 값 제외 필수)

3. 메인 쿼리에서 아이템 ID 가 위에서 구한 부모 ID 리스트에 포함되지 않는(NOT IN) 데이터만 필터링

4. 내림차순 정렬

 

해결 과정

1. SELECT II.ITEM_ID, II.ITEM_NAME, II.RARITY 

= 아이템 ID , 아이템 명 , 희귀도를 선택 테이블 이름 길어서 II 라는 별칭 붙임

2. FROM ITEM_INFO II WHERE II.ITEM_ID NOT IN (...)

= ITEM_INFO 테이블에서 데이터를 추출하지만 NOT IN(속하지 않는 아이템 ID 만 추출)

3. (SELECT PARENT_ITEM_ID FROM ITEM_TREE WHERE PARENT_ITEM_ID IS NOT NULL)

= ITEM_TREE 테이블에서 다른 아이템의 부모 역할을 하는 PARENT_ITEM_ID를 모은고 NULL 값을 걸러준다.

4. 내림차순 정렬

 

답변

SELECT II.ITEM_ID, II.ITEM_NAME, II.RARITY
FROM ITEM_INFO II
WHERE II.ITEM_ID NOT IN (
    SELECT PARENT_ITEM_ID
    FROM ITEM_TREE
    WHERE PARENT_ITEM_ID IS NOT NULL
)

ORDER BY II.ITEM_ID DESC;

 

 

NOT IN 사용할 떄 NULL 처리를 어떻게 하는지 배울 수 있는 문제였다.

서브 쿼리 결과에 NULL 이 단 하나라도 포함되어 있으면 NOT IN 쿼리가 정상 작동 하지않고 아무 데이터도 반환하지 않는다는 것을 배웠다.