프로그래머스_SQL_오답노트_계층쿼리 부모노드 혹은 자식노드 선택 찾기

HEE·2025년 3월 11일
0

프로그래머스 SQL

목록 보기
5/13
post-thumbnail

프로그래머스 SQL 고득점 KIT 내 IS NULL 문제

Level 3. 업그레이드 할 수 없는 아이템 구하기.

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

문제 속 뜻 풀이

부모아이템을 찾으라는 뜻이다.
단순하게 생각하면 ITEM_C, ITEM_D, ITEM_E를 찾으면 되는데,
그렇게 쿼리문을 만들어버리면 나중에 아이템을 추가했을때 쿼리문 전체를 수정해야하며 더 이상 쓸 수 없게 된다. (내가 이렇게 만들어버림...그럼 안돼...)

따라서 쿼리 자체로 더 이상 업그레이드 할 수 없는 아이템을 찾아야한다.

  • 업그레이드 가능한 아이템 - PARENT_ITEM_ID에 등장하는 ITEM_ID = 0,1 (ITEM_A, ITEM_B)
  • 더이상 업그레이드 할 수 없는 아이템 - PARENT_ITEM_ID에 없는 ITEM_ID 인 것
    = ITEM_TREE.ITEM_ID에는 있지만, ITEM_TREE.PARENT_ITEM_ID에 없는 값
    = 2,3,4, ...... (ITEM_C, ITEM_D, ITEM_E ....)

MY SQL

SELECT I.ITEM_ID, I.ITEM_NAME, I.RARITY
FROM ITEM_INFO I 
WHERE I.ITEM_ID NOT IN (SELECT PARENT_ITEM_ID
                       FROM ITEM_TREE
                       WHERE PARENT_ITEM_ID IS NOT NULL)
ORDER BY I.ITEM_ID DESC;

그럼 NULL 값은 어떻게 되나?

WHERE I.ITEM_ID NOT IN (SELECT PARENT_ITEM_ID FROM ITEM_TREE WHERE PARENT_ITEM_ID IS NOT NULL)

PARENT_ITEM_ID 값 중 NULL 아닌 값, 즉 0,1만 가져옴. (업그레이드 가능한 아이템)
거기서 I.ITEM_ID 에서 NOT IN을 사용했으니, 0,1 제외하고 2,3,4 만 선택함.

NULL 값은...?
PARNET_ITEM_ID에 NULL값이 있으나, WHERE PARENT_ITEM_ID IS NOT NULL에서 NULL값을 제외시켰기 때문에, 아예 NULL값을 빼고 가져옴.
즉 NULL 은 NOT IN 대상이 아님. (NOT IN 사용때 NULL값이 있으면 비교가 불가능해짐)


유선배 파랭이 p278 계층쿼리 참고

profile
ALL IS WELL

0개의 댓글