[Programmers] 업그레이드 할 수 없는 아이템 구하기
정답
-- ITEM_INFO: ITEM_ID, ITEM_NAME, RARITY, PRICE
-- ITEM_TREE: ITEM_ID, PARENT_ITEM_ID
SELECT INFO.ITEM_ID, INFO.ITEM_NAME, INFO.RARITY
FROM ITEM_INFO INFO
LEFT JOIN ITEM_TREE TREE ON INFO.ITEM_ID = TREE.PARENT_ITEM_ID
WHERE TREE.PARENT_ITEM_ID IS NULL
ORDER BY 1 DESC;
✅ Point
LEFT JOIN + WHERE ... IS NULL
패턴- INFO.ITEM_ID가 TREE.PARENT_ITEM_ID에 없는 경우 추출
- 개선점:
NOT EXISTS / NOT IN
로 필터링- 주의!
IN
은 근본적으로 OR 연산과 같음 NOT IN
사용 시 SubQuery나 List이 NULL이 포함되면 전체 조건이 UNKNOWN이 되어 예상치 못한 결과가 발생할 수 있음- NULL 값 처리 시
EXISTS
로 처리하는 것이 안전 - (
NOT IN
과NULL
은 조심해서 써야하는 조합)
- 주의!
다른 풀이
NOT IN
풀이 ```sql – ITEM_INFO: ITEM_ID, ITEM_NAME, RARITY, PRICE – ITEM_TREE: ITEM_ID, PARENT_ITEM_ID
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 1 DESC;
- `NOT EXISTS` 풀이
```sql
-- ITEM_INFO: ITEM_ID, ITEM_NAME, RARITY, PRICE
-- ITEM_TREE: ITEM_ID, PARENT_ITEM_ID
SELECT I.ITEM_ID, I.ITEM_NAME, I.RARITY
FROM ITEM_INFO I
WHERE NOT EXISTS (
SELECT 1
FROM ITEM_TREE T
WHERE T.PARENT_ITEM_ID = I.ITEM_ID
)
ORDER BY 1 DESC;