1. 문제
2. 문제 풀기 전 생각해 볼 것
- ITEM_INFO 👉🏻 아이템 ID, 아이템 명, 희귀도 조회
- ITEM_TREE 👉🏻 (서브 쿼리를 이용할 때) PARENT 아이템 ID 조회
- 더 이상 업그레이드 할 수 없는 아이템이어야 함
- 아이템 ID DESC
3. 테이블
ITEM_INFO
ITEM_TREE
4. 풀이 과정 (LEFT JOIN 사용)
1단계) '두 테이블을 이용하여 더 이상 업그레이드 할 수 없는 아이템'을 조회하기 위해, 교집합을 보여주는 INNER JOIN 말고 다른 것을 생각해 볼 필요가 있다.
ITEM_INFO 테이블을 기준으로 아이템들의 업그레이드 전을 보아야 하니 LEFT JOIN을 해 준다.
아래의 출력값을 보면 업그레이드가 가능한 아이템 리스트를 볼 수 있는데, 여기서 아이템 ID와 PARENT 아이템 ID가 NULL값인 것은 더 이상 업그레이드가 불가능한 아이템이라는 것을 의미한다.
SELECT *
FROM ITEM_INFO AS INFO
LEFT OUTER JOIN ITEM_TREE AS TREE
ON INFO.ITEM_ID = TREE.PARENT_ITEM_ID;
2단계) NULL값을 제외해 주는 진정한(?) LEFT JOIN을 해준다.
SELECT *
FROM ITEM_INFO AS INFO
LEFT OUTER JOIN ITEM_TREE AS TREE
ON INFO.ITEM_ID = TREE.PARENT_ITEM_ID
WHERE TREE.PARENT_ITEM_ID IS NULL;
3단계) 아이템 ID, 아이템 명, 희귀도를 조회해 주는 SELECT문을 작성하고, 아이템 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 ITEM_ID DESC;
5. 완성 코드
-- LEFT JOIN 이용
SELECT INFO.ITEM_ID, INFO.ITEM_NAME, INFO.RARITY
FROM ITEM_INFO AS INFO
LEFT OUTER JOIN ITEM_TREE AS TREE
ON INFO.ITEM_ID = TREE.PARENT_ITEM_ID
WHERE TREE.PARENT_ITEM_ID IS NULL
ORDER BY INFO.ITEM_ID DESC;
번외편) 서브 쿼리를 통해 해결한다면?
LEFT JOIN을 사용하지 않아도 서브 쿼리를 통해 문제 해결이 가능하다.
풀이 과정 (서브 쿼리 사용)
1단계) ITEM_INFO 테이블의 아이템 ID, 아이템 명, 희귀도를 조회해 주는 SELECT문을 작성한다.
SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
2단계) 이제 더 이상 업그레이드 할 수 없는 아이템을 조건으로 추가할 차례입니다.
서브 쿼리는 TREE.PARENT 아이템 ID를 조회해야 한다. 해당 컬럼에서 NULL값이 아닌 값은 모두 업데이트가 가능한 아이템이기 때문에 IS NOT NULL을 통해 특정시켜 준다.
👨🏻🏫 IS NULL = NULL인 데이터 조회, IS NOT NULL = NULL이 아닌 데이터를 조회
그리고 외부 쿼리에 있는 ITEM_ID 컬럼에서 NOT IN을 통해 서브 쿼리에서 특정한 값을 제외시켜 주면, 업데이트가 안 되는 아이템만 남는다.
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)
3단계) 아이템 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 ITEM_ID DESC;
완성 코드
-- 서브 쿼리 이용
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;
🔗 관련 링크
프로그래머스 문제 - https://school.programmers.co.kr/learn/courses/30/lessons/273712
IS NULL 함수 설명 - https://passwd.tistory.com/entry/MySQL-NULL-처리-IS-NULL-IFNULL
JOIN 종류 설명 - https://chlgpdus921.github.io/basecamp/MySQL-JOIN/
'Skills > SQL' 카테고리의 다른 글
프로그래머스: 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기 - 시도 및 해결 과정 (MySQL) (0) | 2024.03.13 |
---|---|
프로그래머스: 부서별 평균 연봉 조회하기 (MySQL) (0) | 2024.03.13 |
프로그래머스: 노선별 평균 역 사이 거리 조회하기 (MySQL) (1) | 2024.03.12 |
프로그래머스: 연도별 평균 미세먼지 농도 조회하기 (MySQL) (1) | 2024.03.12 |
프로그래머스: 조건에 맞는 사원 정보 조회하기 (MySQL) (0) | 2024.03.09 |