


문제 이해하느라 힘들었다...(사실 지금도 이해가 잘 안 가...)
일단 결론부터 말하자면 ITEM_TREE테이블의 PARENT_ITEM_ID칼럼에 적혀있지 않은 ITEM_ID를 찾으면 되는것이다.
왜냐? 그..그것은 말이지...
각각의 아이템들이 어떤 아이템으로 업그레이드가 가능한지 알려주는 칼럼이 바로 PARENT_ITEM_ID인데 그 칼럼에 숫자가 없다는 것은 더이상 업그레이드가 불가능 하다는 것을 보여주기 때문이다 → 이게 뭔말이냐...
⬇️여길 봐바
진짜 간단히 말해서 PARENT_ITEM_ID칼럼에 적혀있는 값은 업그레이드가 가능한 아이템의 아이디를 적어놓은 것이다
ITEM_TREE 테이블을 보자
| ITEM_ID | PARENT_ITEM_ID |
|---|---|
| 0 | NULL |
| 1 | 0 |
| 2 | 0 |
| 3 | 1 |
| 4 | 1 |
에서 보면 알듯이 0번 아이템은 1번이라 2번아이템으로 업그레이드가 가능한 것이다.
PARENT_ITEM_ID에 값이 없다는 것은 업그레이드가 안 된다는 거지...
SELECT INFO.ITEM_ID, INFO.ITEM_NAME, INFO.RARITY
FROM ITEM_INFO AS INFO
JOIN ITEM_TREE AS TREE
ON INFO.ITEM_ID = TREE.ITEM_ID
WHERE TREE.ITEM_ID NOT IN
(
SELECT PARENT_ITEM_ID
FROM ITEM_TREE
WHERE PARENT_ITEM_ID IS NOT NULL
GROUP BY PARENT_ITEM_ID
)
ORDER BY ITEM_ID DESC;
그래서 우선 두 테이블을 JOIN 했고,
그 후 조건절 WHERE 에서 NOT IN을 사용했다. → 이게 뭔지 밑에서 설명할게요~😘
마지막으로 아이디를 내림차순 정렬해주었고, 원하는 조건에 맞는 정보만 출력했다.
NOT IN..이게 뭘까?
WHERE 칼럼명 IN 조건문, WHERE 칼럼명 NOT IN 조건문의 형태로 사용되며, 조건문에는 조건 뿐만 아니라 서브쿼리도 들어갈 수 있다.
IN문은 조건에 해당하는 결과를 반환해준다(OR연산 기능)
NOT IN문은 조건에 해당하지 않는 결과만을 반환해준다(AND연산 기능)
사용 방법은 어렵지 않다. 밑의 예시를 보면 더 쉽게 이해할 수 있을 것이다.
--IN문 사용
SELECT * FROM TABLE
WHERE COLUMN IN ('A', 'B')
--IN 해석
SELECT * FROM TABLE
WHERE COLUMN ='A' OR COLUMN ='B'
--NOT IN 사용
SELECT * FROM TABLE
WHERE COLUMN NOT IN ('A', 'B')
--NOT IN 해석
SELECT * FROM TABLE
WHERE COLUMN <> 'A' AND COLUMN <> 'B'
다.만. 주의할 점이 있다.
NOT IN문 서브쿼리의 결과 중에 NULL이 포함되는 경우 데이터가 출력되지 않기 때문에
조회 컬럼에 IS NOT NULL 조건을 추가해서 NULL데이터를 제외시키고 조회를 해야 원하는 결과를 낼 수 있다.
⬇️여길 봐바
NOT IN문의 경우는 AND연산으로 결과가 이루어져.
즉 서브쿼리에 있는 모든 데이터에 대해서 !=(NOT IN)의 결과가 true인 데이터가 조회된거지.
여기서 문제는 PARENT_ITEM_ID엔 NULL값이 포함되어 있다는거야.
NULL과 !=연산을 하는 경우 UNKNOWN(false) 값이 반환되게 되서 조회가 안돼.
그렇기 때문에 서브쿼리에서 NULL은 제외하고 SELECT해줘야 하는거야.
IN문, NOT IN문... 분명히 배웠는데 쓰려고 하면 또 기억에 안나네🥲
이 문제 정리하면서 얼추 개념을 다시 리마인드 할 수 있었다.
사용할 때 NULL을 신경쓰면서 사용해야겠다.
참고 자료📙
https://aljjabaegi.tistory.com/459
https://wildeveloperetrain.tistory.com/223