# 각 아이템들은 오직 하나의 PARENT 아이템 ID 를 가진다
# ROOT 아이템의 PARENT 아이템 ID 는 NULL
# 더 이상 업그레이드할 수 없는 아이템 정보(ITEM_ID, ITEM_NAME, RARITY)를 출력
SELECT item_id, item_name, rarity
FROM ITEM_INFO
WHERE item_id NOT IN (
SELECT DISTINCT(parent_item_id)
FROM ITEM_TREE
WHERE parent_item_id IS NOT NULL
)
ORDER BY 1 desc
parent_item_id 에 대한 NULL 체크를 하지 않을 경우 아무런 결과값이 나오지 않는 것을 확인할 수 있을 것입니다.
여기서 주목할 부분은 NOT IN 구문의 동작 구조인데요.
먼저 IN에 대해 살펴보면, IN은 뒤따라 괄호로 주어지는 값들 중 하나라도 == 비교를 만족하면 해당 데이터를 출력합니다.
즉, OR 연산과 같습니다.
그러나, NOT IN은 뒤따라 괄호로 주어지는 값들 모두에 대해 != 비교를 만족해야 해당 데이터를 출력합니다.
즉, AND 연산과 같습니다.
예를 들어, NOT IN (1, 2, NULL) 일 경우 데이터가 출력되려면 1도 아니고 2도 아니고 NULL도 아니어야 한다는 뜻입니다.
아직 의문이 풀리지 않을 수 있습니다.
"item_id NOT IN (1, 2, NULL) 일 경우, item_id가 3이면 해당 데이터는 출력되어야 하는 것이 아니냐"
해답의 실마리는 NULL과의 비교는 무조건 false이다에 있습니다.
따라서 3은 1도 아니고 2도 아니고 NULL도 아니라고 할지라도 "논리학적"으로 접근했을 때 3과 NULL의 비교 결과값이 false 이기 때문에 NOT IN의 AND 연산에서 결과적으로 false가 되어 아무런 데이터도 반환되지 못하게 됩니다.
명쾌한 설명이네요 궁금했는데 감사합니다
도움이 됐다니 기쁩니다.
감사합니다. 제가 갖고 있던 의문을 정확히 설명해주셨네요.
👍👍👍
감사합니다
감사합니다
감사합니다