Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

집 짓는 개발블로그

[프로그래머스] 업그레이드 된 아이템 구하기 (MySQL) - INNER JOIN으로 NULL 바로 제거하기, EXISTS 본문

MySQL

[프로그래머스] 업그레이드 된 아이템 구하기 (MySQL) - INNER JOIN으로 NULL 바로 제거하기, EXISTS

취준er 2024. 6. 23. 17:26

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/273711

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 요약: 

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)로 대체해도 괜찮다.