[문제]
더 이상 업그레이드할 수 없는 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬해 주세요.
[내가 푼 풀이(정답)]
SELECT
I.ITEM_ID,
I.ITEM_NAME,
I.RARITY
FROM ITEM_INFO I
INNER JOIN ITEM_TREE T
ON I.ITEM_ID = T.ITEM_ID
WHERE T.ITEM_ID NOT IN (SELECT T.PARENT_ITEM_ID
FROM ITEM_TREE T
WHERE T.PARENT_ITEM_ID IS NOT NULL
GROUP BY T.PARENT_ITEM_ID)
ORDER BY I.ITEM_ID DESC
;
[코드리뷰]
- INNER JOIN을 통해 두 가지 테이블을 하나로 조인하였다.
- JOIN한 후 TREE테이블의 PARENT_ITEM_ID 컬럼에 없는 ITEM_ID를 추출해 내야 하기 때문에 (업그레이드를 할 수 없는 ID)
- 서브쿼리를 사용하여 TREE테이블의 PARENT_ITEM_ID만을 추출하였다.
- PARENT_ITEM_ID컬럼 데이터 중 NULL값이 있었기 때문에 NULL값이 아닌 것만 필터링 하였다.
- 또한 중복되지 않도록 PARENT_ITEM_ID별로 그룹화하였다.
- 더이상 업그레이드 할 수 없다는 것은 PARENT_ITEM_ID에 없는 ITEM_ID라는 뜻이니까 NOT IN을 사용하였다.
기억해!
- 일단 데이터 자체, 문제 자체가 이해되지 않았다.
- 더 이상 업그레이드 할 수 없는 데이터?가 무엇을 의미하는지 정확히 파악하기 힘들었다.
A -> B : B는 A의 부모 아이템 ID이다.
즉, "A는 B로 업그레이드 할 수 있다."는 의미였다.
=> 더 이상 업그레이드를 할 수 없는 ITEM_ID는 PARENT_ITEM_ID에 없는 아이템인 셈이다.
- 이걸 파악하는데 조금 시간이 걸렸다....
- 포함되지 않아야 하기 때문에 NOT IN을 사용하였다.