Skills/SQL

[프로그래머스] SQL - '업그레이드 할 수 없는 아이템 구하기' 문제풀이

602yu 2024. 4. 19. 20:54

 

 

문제 링크입니다.

https://school.programmers.co.kr/learn/courses/30/lessons/273712

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

문제 설명

 

 

 

 

 

문제

 

더 이상 업그레이드할 수 없는 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬해 주세요.

 

 

 

풀이1 - WITH절, LEFT JOIN 사용
WITH NO_UPGRADE AS (
    -- ITEM_TREE 테이블에서 부모 아이템이 없는 아이템을 선택
    SELECT DISTINCT PARENT.ITEM_ID
    FROM ITEM_TREE AS PARENT
    -- 부모 아이템이 있는 경우를 찾기 위해 자기 자신을 조인하여 조건 검사
    LEFT JOIN ITEM_TREE AS CHILD ON PARENT.ITEM_ID = CHILD.PARENT_ITEM_ID
    WHERE CHILD.PARENT_ITEM_ID IS NULL
)

-- 업그레이드가 없는 아이템에 대한 정보를 ITEM_INFO 테이블과 조인하여 추출
SELECT INFO.ITEM_ID,
    INFO.ITEM_NAME,
    INFO.RARITY
FROM NO_UPGRADE AS N
    INNER JOIN ITEM_INFO AS INFO ON INFO.ITEM_ID = N.ITEM_ID
ORDER BY INFO.ITEM_ID DESC

 

<풀이1> WITH절 사용하여 업그레이드가 없는 아이템을 필터링합니다. 이를 위해 LEFT JOIN과 DISTINCT를 사용하여 업그레이드를 가진 아이템의 부모 아이템을 찾고, 이를 제외한 결과를 선택합니다.

 

 

 

 

풀이2 - 오직 서브쿼리만 사용
SELECT ITEM_ID,
    ITEM_NAME,
    RARITY
FROM ITEM_INFO
WHERE ITEM_ID NOT IN (SELECT DISTINCT PARENT_ITEM_ID -- 서브쿼리는 ITEM_TREE 테이블에서 업그레이드를 가진 아이템의 부모 아이템 ID를 선택
                      FROM  ITEM_TREE 
                      WHERE PARENT_ITEM_ID IS NOT NULL)
ORDER BY ITEM_ID DESC

 

<풀이2> 서브쿼리를 사용하여 업그레이드가 있는 아이템의 부모 아이템 ID를 선택하고, 이를 NOT IN 절을 통해 업그레이드가 없는 아이템을 필터링합니다.

 


두 쿼리는 결론적으로 같은 결과를 반환하지만, 두 번째 쿼리는 조금 더 명시적이고 조인을 사용하여 필터링을 수행하기 때문에 성능 면에서 약간 더 효율적일 수 있습니다.