프로그래머스 SQL 오답노트 Level 3 업그레이드 할 수 없는 아이템 구하기
프로그래머스 업그레이드 할 수 없는 아이템 구하기
<문제>
더 이상 업그레이드할 수 없는 아이템의 아이템 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