https://school.programmers.co.kr/learn/courses/30/lessons/273712
더 이상 업그레이드할 수 없는 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬해 주세요.
291명만 푼 따끈따끈한 문제이다
1)
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (SELECT PARENT_ITEM_ID
FROM ITEM_TREE
WHERE PARENT_ITEM_ID IS NOT NULL)
ORDER BY ITEM_ID DESC;
2)
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO A
WHERE NOT EXISTS (SELECT *
FROM ITEM_TREE B
WHERE B.PARENT_ITEM_ID = A.ITEM_ID )
ORDER BY ITEM_ID DESC;
서브쿼리와 NOT IN 연산자로 풀었다.
문제를 풀면서 든 생각은 'ITEM_ID가 PARENT_ITEM_ID에 없으면 될 것 같은데 이걸 어떻게 구현하지?'였다.
---처음에 구현했다가 틀린 코드
SELECT A.ITEM_ID, A.ITEM_NAME, A.ITEM_RARITY
FROM ITEM_INFO A
INNER JOIN ITEM_TREE B ON A.ITEM_ID = B.ITEM_ID
WHERE A.ITEM_ID NOT EXISTS B.PARENT_ITEM_ID
ORDER BY A.ITEM_ID DESC;
그래서 NOT EXISTS를 썼는데 알고보니 EXSITS는 서브 쿼리 연산자이고 서브쿼리가 반환하는 결과값이 있는지, 없는지만 확인한다고 한다.
결과가 있는지 없는지만 확인한다는 것을 알고난 후 코드를 다시 짜봤다.(풀이 2번에 써있는 코드이다)
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO A
WHERE NOT EXISTS (SELECT *
FROM ITEM_TREE B
WHERE B.PARENT_ITEM_ID = A.ITEM_ID )
ORDER BY ITEM_ID DESC;
=> ITEM_ID와 PARENT_ITEM_ID가 같은 게 존재하지 않으면 출력하는 형식이다.