👇 업그레이드 된 아이템 구하기
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
🔓 문제 설명
아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요.
이때 결과는 아이템 ID를 기준으로 내림차순 정렬주세요.
예시 문제 데이터
[ITEM_INFO]
| ITEM_ID | ITEM_NAME | RARITY |
| 0 | ITEM_A | RARE |
| 1 | ITEM_B | RARE |
| 2 | ITEM_C | LEGEND |
| 3 | ITEM_D | RARE |
| 4 | ITEM_E | RARE |
[ITEM_TREE]
| ITEM_ID (자식) | PARENT_ITEM_ID (부모) |
| 1 | 0 |
| 2 | 0 |
| 3 | 1 |
| 4 | 1 |
⚡SQL Query
SELECT I.ITEM_ID, I.ITEM_NAME, I.RARITY
FROM ITEM_INFO I
JOIN ITEM_TREE T ON I.ITEM_ID = T.ITEM_ID
WHERE T.PARENT_ITEM_ID IN (
SELECT ITEM_ID
FROM ITEM_INFO
WHERE RARITY = 'RARE'
)
ORDER BY I.ITEM_ID DESC;
🔎 풀이 설명
1. 테이블 병합: ITEM_TREE와 ITEM_ID를 조인하여 부모-자식 간 관계를 한 테이블에 병합합니다.
2. 관계 찾기: 병합된 테이블에서 PARENT_ITEM_ID와 ITEM_INFO 테이블에서 희귀도가 'RARE'인 컬럼의 관계를 찾습니다.
- 부모 0인 자식 :1, 2
- 부모 1인 자식: 3, 4
- 부모 3인 자식: X
- 부모 4인 자식: X
2. 필터링: 먼저 희귀도 'RARE'인 ITEM_ID를 뽑아 PARENT_ITEM_ID와 비교하여 자식 데이터(업그레이드 아이템)를 추출합니다.
💡인사이트
1. Self Join 성능
- 이 문제처럼 한 테이블 내에서 부모-자식 관계를 맺을 때는 조인 순서가 성능을 결정합니다. 'RARE' 아이템 수가 적다면, ITEM_INFO(RARE)를 먼저 읽고 ITEM_TREE를 거쳐 다시 ITEM_INFO로 가는 Nested Loop Join이 가장 효율적입니다.
2. 계층형 쿼리 (Oracle)
- 만약 "모든 하위 업그레이드 아이템"을 다 찾아야 한다면 Oracle에서는 START WITH ... CONNECT BY 구문을 사용해야 하지만, 이 문제처럼바로 다음(1단계)업그레이드만 묻는다면 일반 JOIN이나 IN 서브쿼리가 훨씬 가볍고 빠릅니다.
'🗄️ DB_이야기 > # ⚡SQL' 카테고리의 다른 글
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 조건에 맞는 개발자 찾기(SELECT) (1) | 2026.04.15 |
|---|---|
| 🚀[SQL 알고리즘 문제 풀이] Programmers : Python 개발자 찾기(SELECT) (0) | 2026.04.15 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 상위 n개 레코드(SELECT) (0) | 2026.04.15 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 오프라인/온라인 판매 데이터 통합하기(SELECT) (0) | 2026.04.14 |
| 🚀[SQL 알고리즘 문제 풀이] Programmers : 재구매가 일어난 상품과 회원 리스트 구하기(SELECT) (0) | 2026.04.14 |