2025. 3. 25. 19:46ㆍ프로그래머스/SQL
문제링크: 업그레이드 된 아이템 구하기
문제설명
어느 한 게임에서 사용되는 아이템들은 업그레이드가 가능합니다.
'ITEM_A'->'ITEM_B'와 같이 업그레이드가 가능할 때
'ITEM_A'를 'ITEM_B' 의 PARENT 아이템,
PARENT 아이템이 없는 아이템을 ROOT 아이템이라고 합니다.
예를 들어 'ITEM_A'->'ITEM_B'->'ITEM_C'와 같이 업그레이드가 가능한 아이템이 있다면
'ITEM_C'의 PARENT 아이템은 'ITEM_B'
'ITEM_B'의 PARENT 아이템은 'ITEM_A'
ROOT 아이템은 'ITEM_A'가 됩니다.
다음은 해당 게임에서 사용되는 아이템 정보를 담은 ITEM_INFO 테이블과 아이템 관계를 나타낸 ITEM_TREE 테이블입니다. ITEM_INFO 테이블은 다음과 같으며, ITEM_ID, ITEM_NAME, RARITY, PRICE는 각각 아이템 ID, 아이템 명, 아이템의 희귀도, 아이템의 가격을 나타냅니다.
ITEM_TREE 테이블은 다음과 같으며, ITEM_ID, PARENT_ITEM_ID는 각각 아이템 ID, PARENT 아이템의 ID를 나타냅니다.
단, 각 아이템들은 오직 하나의 PARENT 아이템 ID를 가지며, ROOT 아이템의 PARENT 아이템 ID는 NULL 입니다.
ROOT 아이템이 없는 경우는 존재하지 않습니다.
문제
아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬주세요.
문제풀이
SELECT A.ITEM_ID, A.ITEM_NAME, A.RARITY
JOIN ITEM_INFO A ON ITEM_TREE B
WHERE B.PARENT_OTEM_ID= A.ITEM_ID WHERE A.PARITY = 'RARE'
ORDER BY ITEM_ID DESC;
오류 분석
- JOIN ITEM_INFO A ON ITEM_TREE B
- JOIN 문법이 잘못되었습니다. JOIN을 사용할 때는 어떤 테이블을 어떤 기준으로 조인할지 명확히 작성해야 합니다.
- ITEM_TREE B는 ON 뒤에 올 수 없으며, JOIN ITEM_TREE B ON 조건 형식으로 써야 합니다.
- WHERE 절이 두 개 있음
- WHERE B.PARENT_OTEM_ID= A.ITEM_ID WHERE A.PARITY = 'RARE'
- WHERE 키워드는 한 번만 사용할 수 있습니다. 두 번째 WHERE는 AND로 바꿔야 합니다.
요구사항 정리
- RARITY = 'RARE'인 아이템을 찾는다.
- 해당 아이템들의 다음 업그레이드 아이템(ITEM_TREE에서 PARENT_ITEM_ID가 해당 아이템의 ITEM_ID인 것)을 찾는다.
- 결과에는 ITEM_ID, ITEM_NAME, RARITY를 포함한다.
- ITEM_ID를 기준으로 내림차순 정렬한다.
- ITEM_INFO A: RARITY = 'RARE'인 아이템을 찾기 위한 테이블 별칭.
- JOIN ITEM_TREE T ON A.ITEM_ID = T.PARENT_ITEM_ID
- A.ITEM_ID가 T.PARENT_ITEM_ID와 일치하는 행을 찾음 (즉, A의 다음 업그레이드 아이템을 찾음).
- JOIN ITEM_INFO B ON T.ITEM_ID = B.ITEM_ID
- T.ITEM_ID를 이용하여 업그레이드된 아이템(B)의 정보를 가져옴.
- WHERE A.RARITY = 'RARE'
- RARE 희귀도를 가진 아이템들만 조회.
- ORDER BY B.ITEM_ID DESC
- 아이템 ID 기준 내림차순 정렬.
나의코드
SELECT B.ITEM_ID, B.ITEM_NAME, B.RARITY
FROM ITEM_INFO A
JOIN ITEM_TREE T ON A.ITEM_ID = T.PARENT_ITEM_ID
JOIN ITEM_INFO B ON T.ITEM_ID = B.ITEM_ID
WHERE A.RARITY = 'RARE'
ORDER BY B.ITEM_ID DESC;
참고하기
SQL 문법 정리
1. JOIN 문법
(1) INNER JOIN
JOIN을 사용하면 두 개 이상의 테이블을 특정 조건을 기준으로 결합할 수 있다.
SELECT A.ITEM_ID, A.ITEM_NAME
FROM ITEM_INFO A
JOIN ITEM_TREE B ON A.ITEM_ID = B.PARENT_ITEM_ID;
- JOIN ITEM_TREE B ON A.ITEM_ID = B.PARENT_ITEM_ID
- A.ITEM_ID와 B.PARENT_ITEM_ID가 같은 경우만 결합
- INNER JOIN의 기본 동작이므로 INNER 키워드는 생략 가능
2. WHERE 절
WHERE 절은 특정 조건을 만족하는 행만 필터링할 때 사용한다.
WHERE A.RARITY = 'RARE'
- A.RARITY = 'RARE' : 희귀도가 'RARE'인 아이템만 선택
- WHERE 절은 JOIN과 함께 사용 가능
3. ORDER BY (정렬)
ORDER BY를 사용하여 결과를 정렬할 수 있다.
ORDER BY B.ITEM_ID DESC;
- B.ITEM_ID DESC : 아이템 ID 기준으로 내림차순 정렬
- ASC(오름차순, 기본값) / DESC(내림차순)
4. SQL 조인 활용한 문제 해결 패턴
(1) 부모-자식 관계 찾기
JOIN ITEM_TREE T ON A.ITEM_ID = T.PARENT_ITEM_ID
- ITEM_INFO A에서 RARE 희귀도를 가진 아이템 찾기
- ITEM_TREE에서 해당 아이템을 PARENT_ITEM_ID로 가지는 행을 찾음 (즉, 업그레이드된 아이템 찾기)
(2) 찾은 자식 아이템의 정보 가져오기
JOIN ITEM_INFO B ON T.ITEM_ID = B.ITEM_ID
- ITEM_TREE T에서 찾은 자식 아이템의 정보를 ITEM_INFO B와 결합하여 가져옴
(3) 최종 SQL 코드
SELECT B.ITEM_ID, B.ITEM_NAME, B.RARITY
FROM ITEM_INFO A
JOIN ITEM_TREE T ON A.ITEM_ID = T.PARENT_ITEM_ID
JOIN ITEM_INFO B ON T.ITEM_ID = B.ITEM_ID
WHERE A.RARITY = 'RARE'
ORDER BY B.ITEM_ID DESC;
5. 응용 예제
특정 희귀도 이상의 업그레이드 아이템 찾기
SELECT B.ITEM_ID, B.ITEM_NAME, B.RARITY
FROM ITEM_INFO A
JOIN ITEM_TREE T ON A.ITEM_ID = T.PARENT_ITEM_ID
JOIN ITEM_INFO B ON T.ITEM_ID = B.ITEM_ID
WHERE A.RARITY IN ('RARE', 'EPIC')
ORDER BY B.RARITY DESC, B.ITEM_ID DESC;
- A.RARITY IN ('RARE', 'EPIC') → 'RARE' 또는 'EPIC'인 부모 아이템만 선택
- ORDER BY B.RARITY DESC, B.ITEM_ID DESC → 희귀도 높은 순으로 정렬 후 같은 희귀도 내에서 아이템 ID 내림차순 정렬
'프로그래머스 > SQL' 카테고리의 다른 글
[프로그래머스][LV.1] 평균 일일 대여 요금 구하기 | Oracle (0) | 2025.03.27 |
---|---|
[프로그래머스][LV.1] 평균 일일 대여 요금 구하기 | Oracle (0) | 2025.03.26 |
[프로그래머스][LV.2] 재구매가 일어난 상품과 회원 리스트 구하기 | Oreacle (0) | 2025.03.22 |
[프로그래머스][LV.3] 과일로 만든 아이스크림 고르기 | Oracle (0) | 2025.03.22 |
[프로그래머스][LV.1] 조건에 맞는 도서 리스트 출력하기 | Oracle (0) | 2025.03.20 |