집 짓는 개발블로그
[프로그래머스] 업그레이드 된 아이템 구하기 (MySQL) - INNER JOIN으로 NULL 바로 제거하기, EXISTS 본문
https://school.programmers.co.kr/learn/courses/30/lessons/273711
문제 요약:
2024.06.21 - [MySQL] - [프로그래머스] 업그레이드 할 수 없는 아이템 구하기 (MySQL) - IN, EXISTS, NULL, Three-valued logic
위와 비슷한 문제. NULL을 조심해서 처리하면 된다.
소요시간: 30분
3번의 시도 끝에 맞혔다. 복잡하게 생각하다가 망한 문제.ㅎㅎ
이 문제가 더 어려웠던 이유는 업그레이드 가능 조건과 더불어 RARITY 컬럼의 값에 대한 조건이 있었기 때문인 것 같다. 업그레이드 전에도 한 번 필터링해야 하는 게 헷갈렸다.
정답
# 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 아이템 ID 테이블
WITH UP_ABLE AS(
SELECT T.ITEM_ID FROM ITEM_TREE T
-- INNER JOIN으로 item_tree테이블에 있는 null 알아서 제외되도록 함
INNER JOIN ITEM_INFO I ON T.PARENT_ITEM_ID = I.ITEM_ID
WHERE I.RARITY = 'RARE')
SELECT I.ITEM_ID, I.ITEM_NAME, I.RARITY FROM ITEM_INFO I
WHERE EXISTS (SELECT * FROM UP_ABLE UP WHERE I.ITEM_ID = UP.ITEM_ID)
ORDER BY I.ITEM_ID DESC;
이 쿼리에서는 두 가지 방법을 써서 NULL을 제외했지만 한 가지만 써도 된다.
1) UP_ABLE 만들면서 INNER JOIN으로 조인 컬럼에 있는 NULL을 제외하고 조인
2) 메인 쿼리에서 EXISTS를 써서 NULL과의 비교연산은 UNKNOWN으로 평가되게 해, 전체 조건이 FALSE로 간주되게 함. 그런데 이미 이 시점에서는 UP_ABLE의 ITEM_ID에는 NULL이 없어서, 사실 WHERE I.ITEM_ID IN (SELECT * FROM UP_ABLE)로 대체해도 괜찮다.
'MySQL' 카테고리의 다른 글
[프로그래머스] 분기별 분화된 대장균의 개체 수 구하기 (MySQL) - Alias와 "'따옴표'", MONTH, DAY, CASE-WHEN-THEN-ELSE-END (2) | 2024.06.27 |
---|---|
[프로그래머스] 노선과 평균 역 사이 거리 조회하기 (MySQL) (0) | 2024.06.24 |
[프로그래머스] LV.3 숫자 게임 (Python) - deque (0) | 2024.06.22 |
[프로그래머스] 조건에 맞는 개발자 찾기 (MySQL) - EXISTS, 서브쿼리 (0) | 2024.06.22 |
[프로그래머스] 업그레이드 할 수 없는 아이템 구하기 (MySQL) - IN, EXISTS, NULL, Three-valued logic (0) | 2024.06.21 |