[SQL] 업그레이드 된 아이템 구하기

제로·2026년 3월 25일

📍 문제

어느 한 게임에서 사용되는 아이템들은 업그레이드가 가능합니다.

ITEM_A ➡️ ITEM_B와 같이 업그레이드가 가능할 때
ITEM_A를 ITEM_B 의 PARENT,
PARENT 아이템이 없는 아이템을 ROOT라고 합니다.

예를 들어 ITEM_A ➡️ ITEM_B ➡️ ITEM_C 와 같이 업그레이드가 가능한 아이템이 있다면

ITEM_CPARENT 아이템은 ITEM_B
ITEM_BPARENT 아이템은 ITEM_A
ROOT 아이템은 ITEM_A가 됩니다.

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

<ITEM_INFO>
ITEM_ID - 아이템 ID
ITEM_NAME - 아이템 명
RARITY - 아이템의 희귀도
PRICE - 아이템의 가격

<ITEM_TREE>
ITEM_ID - 아이템 ID
PARENT_ITEM_ID - PARENT 아이템의 ID

각 아이템들은 오직 하나의 PARENT_ITEM_ID를 가지며,
ROOT 아이템의 PARENT_ITEM_IDNULL 입니다.
ROOT 아이템이 없는 경우는 존재하지 않습니다.

아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템
아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요.
이때 결과는 아이템 ID를 기준으로 내림차순 정렬해 주세요.

처음에는 subquery 사용하지 않고
일단 ROOT는 아니어야 된다는 거니까 IS NOT NULL 사용했다.

SELECT
    INFO.ITEM_ID,
    INFO.ITEM_NAME,
    INFO.RARITY
FROM ITEM_INFO INFO
JOIN ITEM_TREE TREE
    ON INFO.ITEM_ID = TREE.ITEM_ID
WHERE INFO.RARITY = 'RARE'
	AND TREE.PARENT_ITEM_ID IS NOT NULL

이렇게 풀었는데
결과를 보니 아니라는 것이다!
OMG

생각해 보니 다음 업그레이드 아이템이 되려면, ITEM_ID가 타 아이템의 PARENT_ITEM_ID와 같아야 한다.
예를 들면, A아이템의PARENT_ITEM_ID 값이 B아이템의 ITEM_ID와 같다면 B아이템이 A아이템의 PARENT가 되는 것이니까,
A아이템의 다음 업그레이드 아이템은 B아이템이 되는 것이다.

이를 구하려면 subquery를 사용해서,
RARITY가 RARE인 ITEM_ID를 이용해
PARENT_ITEM_ID를 찾아야 한다.
그래야 RARITY가 RARE인 아이템의 업그레이드 아이템 ID를 알 수 있으니까

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

너무 문제를 헷갈리게 내 놓았네...
ㄴ 님의 문해력이 문제라는 생각은?

0개의 댓글