최대 1 분 소요

문제 링크

정답

-- 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 INNULL은 조심해서 써야하는 조합)

다른 풀이

  • 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;