[SQL] 업그레이드 된 아이템 구하기

유지민·2024년 3월 4일

SQL

목록 보기
8/23
post-thumbnail

문제 보기

문제 설명

어느 한 게임에서 사용되는 아이템들은 업그레이드가 가능합니다.
'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, 아이템 명, 아이템의 희귀도, 아이템의 가격을 나타냅니다.

Column name	Type	Nullable
ITEM_ID	INTEGER	FALSE
ITEM_NAME	VARCHAR(N)	FALSE
RARITY	INTEGER	FALSE
PRICE	INTEGER	FALSE

ITEM_TREE 테이블은 다음과 같으며, ITEM_ID, PARENT_ITEM_ID는 각각 아이템 ID, PARENT 아이템의 ID를 나타냅니다.

Column name	Type	Nullable
ITEM_ID	INTEGER	FALSE
PARENT_ITEM_ID	INTEGER	TRUE

단, 각 아이템들은 오직 하나의 PARENT 아이템 ID를 가지며, ROOT 아이템의 PARENT 아이템 ID는 NULL 입니다.

ROOT 아이템이 없는 경우는 존재하지 않습니다.

문제

아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬주세요.

예시
예를 들어 ITEM_INFO 테이블이 다음과 같고

ITEM_ID	ITEM_NAME	RARITY	PRICE
0	ITEM_A	RARE	10000
1	ITEM_B	RARE	9000
2	ITEM_C	LEGEND	11000
3	ITEM_D	RARE	10000
4	ITEM_E	RARE	12000

ITEM_TREE 테이블이 다음과 같다면

ITEM_ID	PARENT_ITEM_ID
0	NULL
1	0
2	0
3	1
4	1

아이템의 희귀도가 'RARE'인 아이템은 'ITEM_A', 'ITEM_B', 'ITEM_D', 'ITEM_E' 입니다.
이 중 'ITEM_A' 는 'ITEM_B', 'ITEM_C' 로 업그레이드가 가능하며 'ITEM_B' 는 'ITEM_D' , 'ITEM_E' 로 업그레이드가 가능합니다. 'ITEM_D' 와 'ITEM_E'는 더 이상 업그레이드가 가능하지 않습니다. 따라서 결과는 다음과 같이 나와야 합니다.

ITEM_ID	ITEM_NAME	RARITY
4	ITEM_E	RARE
3	ITEM_D	RARE
2	ITEM_C	LEGEND
1	ITEM_B	RARE

※ 참고: 본 문제는 제출 내역 확인 기능을 지원하지 않습니다.

정답 코드

SELECT
    it.ITEM_ID,
    ii.ITEM_NAME,
    ii.RARITY
FROM
    ITEM_INFO AS ii
    INNER JOIN ITEM_TREE AS it
        ON ii.ITEM_ID=it.ITEM_ID
WHERE it.PARENT_ITEM_ID IN (SELECT ITEM_ID
                              FROM ITEM_INFO
                              WHERE RARITY='RARE')
ORDER BY
    it.ITEM_ID DESC

INNER JOIN(== JOIN) : 두 테이블 조인(내부 조인)

ITEM_INFO와 ITEM_TREE 테이블로부터 ITEM_ID, ITEM_NAME, RARITY를 가져와야 하므로, INNER_JOIN을 통해 특정 조건(ITEM_INFO 테이블의 ITEM_ID 중 RARITY의 값이 'RARE'인 컬럼)을 만족하는 값만을 가져오기 위해 사용한다.

IN 연산자의 사용 예

리스트와의 비교: IN을 사용하여 특정 열의 값이 주어진 리스트에 포함되어 있는지 검사

SELECT * FROM employees
WHERE department_id IN (10, 20, 30);

이 쿼리는 department_id가 10, 20, 또는 30인 모든 직원을 선택

서브쿼리와의 비교: IN을 사용하여 특정 열의 값이 서브쿼리의 결과 집합에 포함되어 있는지 검사 가능

SELECT * FROM products
WHERE category_id IN (SELECT category_id FROM categories WHERE active = 1);

이 쿼리는 active 상태인 카테고리에 속하는 모든 제품을 선택

profile
끊임없이 도전하며 사고하는 주니어 Web 개발자 유지민입니다.

0개의 댓글