[SQL] inner join & where_in (서브쿼리)로 특정조건을 만족하는 데이터 참조하기 / lv2.업그레이드 된 아이템 구하기 상세풀이

도리·2025년 2월 11일

programmers lv2 업그레이드 된 아이템 구하기

문제)

item_A -> item_B , 즉 아이템 a는 아이템b로 업그레이드 가능하다.
이때 a는 root 이자 b의 Parent item 이다.

<원하는 출력>

아이템의 희귀도가 'rare'인 아이템들의 모든 다음 업그레이드 아이템의 정보(id, name, rarity)

<주어진 정보>

table : item_info (item_id, item_name, rarity, price)
, item_tree (item_id, parent_item_id)

<풀이>

구해야하는 것은 아이템의 희귀도가 'rare'인 아이템의 정보가 아니다.
아이템의 희귀도가 'rare'인 아이템의 모든 다음업그레드 아이템의 정보이다.

1.parent_item_id의 id가 rarity='rare'인 경우를 추출하고,
->

2.그 id의 정보를 추출해야 하는 것이다.
->

<코드>

select ii.item_id, ii.item_name,ii.rarity
from item_info ii 
join item_tree 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 ii.item_id desc

포인트는
item_tree의 parent_item_id가 item_info의 id (rarity='rare'인) 와 일치해야한다는 조건을 join 후 서브쿼리로 구현한 것이다.

이것을 구현하는 방법이 헷갈렸었다.

<.cf.>

self join 에 대한 설명과 유사하여 정리해보려고 한다.

(참고한유투브 링크)

경리부장의 직속상관의 연락처를 알아야하는상황으로 한 Table안에 두 열을 서로 join 하지 않고는 풀기 어렵다.

select a.emp "직원", b.emp "직속상관", b.phone "직속상관연락처"
from emp_table a
inner join emp_table b on a.manager = b.emp
where a.emp = "경리부장";

a를 직원테이블 , b를 직속상관 테이블로 만들어버리는 것이다.
: join 시 a의 직속상관이 b의 직원이 되게 만들고, 각각의 table에서 필요한 열들을 select하여 표시하면 된다.

어떻게 조인하여 어떤 것을 가져올 수 있을까를 항상 고민하여 쿼리를 짜야겠다.

다시풀어보기...

-- rarity가 rare인 item이 parent item id가 있을지 뽑고 또 info가서 정보출력하기
with rare_id as ( 
select item_id
from item_info 
where rarity= 'rare') 
, upgrade_id  as (
select t.item_id
from item_tree t
join rare_id r
where t.parent_item_id = r.item_id)
select i.item_id,i.item_name, i.rarity
from item_info i
join upgrade_id u on u.item_id = i.item_id
where i.item_id = u.item_id
order by item_id desc
  • 정답이긴 했지만 공부했던 것과 다른 풀이가 나왔다.. ㅋㅋ 나는 with as 구문 쓰는게 편해서 이렇게 짠것 같다.
profile
인공지능응용학과 졸업

0개의 댓글