해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.
해당 글에서는 JOIN 이용하여 푸는 문제로 초보자가 하기에는 쉬움 정도의 난이도를 가지고 있는 것 같습니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다.
더 이상 업그레이드할 수 없는 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬해 주세요.
이 문제는 테이블을 보고 판단하기에는 살짝 헷갈릴 수도 있으나, 잘 이해한다면 쉽게 풀 수 있습니다.
우선 저희가 ITEM_ID 0번을 보고 있다고 가정하겠습니다.
이 때, ITEM_TREE 테이블의 PARENT_ITEM_ID는 저희가 보고 있는 0번의 아이템을 말하고 ITEM_TREE의 ITEM_ID는 어떤 ITEM으로 바뀔 수 있는 지에 대한 컬럼 값입니다.
이런 식으로 생각해보면 문제에서는 더 이상 업그레이드 할 수 없는 아이템을 뽑으라 하였으니 JOIN을 했을 때, 여러 행들 중 ITEM_TREE구간에서의 ITEM_ID가 NULL로 되어있을 것입니다.(아이템에 맞는 PARENT_ITEM_ID값이 없기 때문)
이렇게 생각하시고 풀어주시면 될 것 같습니다.
1. JOIN으로 테이블 합쳐주기(정답 X)
SELECT *
FROM ITEM_INFO i
JOIN
ITEM_TREE t ON i.ITEM_ID = t.PARENT_ITEM_ID
저희는 위에서 말했듯이 ITEM_ID의 값이 NULL을 확인해야 하지만 해당 결과에서는 NULL값이 없습니다.
당연하게도 그냥 JOIN을 사용하게 되면 INNER JOIN이 디폴트로 설정 됩니다.
그래서 결국 조건에 맞는 값(i.ITEM_ID = t.PARENT_ITEM_ID) 또는 겹치는 값만 가져오게 되는 것입니다.
그럼 저희는 결국 ITEM_INFO에서의 모든 ITEM_ID를 확인하고 싶은 것입니다.
즉, LEFT JOIN을 이용해야 한다는 것입니다.
LEFT JOIN은 조인할 때 기준이 되는 첫 번째 테이블에 있는 모든 행을 유지하면서 오른쪽 테이블의 데이터를 조인하는 것입니다.
2. LEFT JOIN 사용하기
SELECT *
FROM ITEM_INFO i
LEFT JOIN
ITEM_TREE t ON i.ITEM_ID = t.PARENT_ITEM_ID
아까의 결과와는 달리 첫번째 테이블에 있는 모든 행이 출력된 것을 확인 할 수 있습니다. 그리고 null값 또한 확인 됩니다.
즉, 이 null이 해당하는 ITEM_ID들이 더 이상 업그레이드 할 수 없는 값들입니다.
WHERE절을 사용하여 null값만 가져오면 될 것 같습니다.
3. 조건에 맞게 WHERE절 추가와 컬럼 추가
SELECT i.ITEM_ID
, i.ITEM_NAME
, i.RARITY
FROM ITEM_INFO i
LEFT JOIN
ITEM_TREE t ON i.ITEM_ID = t.PARENT_ITEM_ID
WHERE t.PARENT_ITEM_ID IS NULL
ORDER BY i.ITEM_ID DESC
이 처럼 WHERE 절에 IS NULL을 추가하여 NULL값만 가져오도록 설정해주었습니다.
그리고 마지막으로 조건에 맞는 정렬을 넣어주게 되면 코드는 정답이 됩니다.
이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.
'Data Analyst > SQL' 카테고리의 다른 글
[SQL] Programmers 문제 풀기(주문량이 많은 아이스크림들 조회하기) (0) | 2024.11.06 |
---|---|
[SQL] Programmers 문제 풀기(년, 월, 성별 별 상품 구매 회원 수 구하기) (0) | 2024.11.05 |
[SQL] Programmers 문제 풀기(연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기) (0) | 2024.11.01 |
[SQL] Programmers 문제 풀기(저자 별 카테고리 별 매출액 집계하기) (0) | 2024.10.31 |
[SQL] Programmers 문제 풀기(즐겨찾기가 가장 많은 식당 정보 출력하기) (0) | 2024.10.30 |