Every Step Matters

[프로그래머스 SQL Lv.2] ROOT 아이템 구하기 (MySQL) 본문

Database/SQL

[프로그래머스 SQL Lv.2] ROOT 아이템 구하기 (MySQL)

imnyoung 2026. 1. 5. 16:56

문제링크 : https://school.programmers.co.kr/learn/courses/30/lessons/273710

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

1. 테이블

(1) ITEM_INFO

Column name Type Nullable Description
ITEM_ID INTEGER FALSE 아이템 ID
ITEM_NAME VARCHAR(N) FALSE 아이템 명
RARITY INTEGER FALSE 아이템의 희귀도
PRICE INTEGER FALSE 아이템의 가격

(2) ITEM_TREE

Column name Type Nullable Description
ITEM_ID INTEGER FALSE 아이템 ID
PARENT_ITEM_ID INTEGER TRUE PARENT 아이템의 ID
'ITEM_A'->'ITEM_B'와 같이 업그레이드가 가능할 때 'ITEM_A'를 'ITEM_B'의 PARENT 아이템이라고 하며,
PARENT 아이템이 없는 아이템을 ROOT 아이템이라고 한다.

 

2. 문제

(1) ROOT 아이템을 찾아 (2) 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME)을 출력하는 SQL문을 작성해 주세요. 이때, (3) 결과는 아이템 ID를 기준으로 오름차순 정렬해 주세요.

 

3. 문제풀이

(1) ROOT 아이템을 찾기 위해서는 item_tree 테이블에서 RARENT_ITEM_ID가 NULL인 아이템을 찾고, 해당 아이템에 대해 item_info에 있는 item_id, item_name을 출력해야 한다. 따라서 두 테이블을 먼저 조인해야 한다.

SELECT T1.item_id, item_name  -- (2) 아이템id, 아이템 이름 조회
FROM item_info T1
JOIN item_tree T2
ON T1.item_id = T2.item_id
SELECT문에서 item_name은 item_tree 테이블에만 있는 컬럼명이므로 시스템이 알아서 해당 테이블의 컬럼으로 인식한다. item_id는 두 테이블 모두에 있는 컬럼명이므로 어떤 테이블의 컬럼인지 명시해 줘야 한다. 

이후 조인한 테이블에서 RARENT_ITEM_ID가 NULL인 아이템을 찾는다.

SELECT T1.item_id, item_name
FROM item_info T1
JOIN item_tree T2
ON T1.item_id = T2.item_id
WHERE T2.parent_item_id IS NULL  -- (1) ROOT 아이템 찾기 (WHERE 대신 AND 사용해도 결과 동일)
WHERE 대신 AND를 사용해서 조인조건으로 먼저 걸러줄 수도 있다. 하지만 가시성을 위해 WHERE을 더 추천한다.

(3) 결과를 아이템 ID 기준으로 오름차순 정렬한다.

SELECT T1.item_id, item_name
FROM item_info T1
JOIN item_tree T2
ON T1.item_id = T2.item_id
WHERE T2.parent_item_id IS NULL
ORDER BY T1.item_id   -- (4) item_id 기준 오름차순 정렬

 

4. 정답

따라서 정답은

SELECT T1.item_id, item_name
FROM item_info T1
JOIN item_tree T2
ON T1.item_id = T2.item_id
WHERE T2.parent_item_id IS NULL
ORDER BY T1.item_id