문제
https://www.hackerrank.com/challenges/binary-search-tree-1/problem?isFullScreen=true
Binary Tree Nodes | HackerRank
Write a query to find the node type of BST ordered by the value of the node.
www.hackerrank.com
Find the node type of Binary Tree ordered by the value of the node.
- Root : If node is root node
- Leaf : If node is leaf node
- Inner : If node is neither root nor leaf node
테이블
BST |
![]() |
풀이과정
# 오답
1 2 3 4 5 6 7 | SELECT N, CASE WHEN P IS NULL THEN 'Root' WHEN P IS NOT NULL AND N NOT IN (SELECT P FROM BST) THEN 'Leaf' ELSE 'Inner' END FROM BST ORDER BY N | cs |
# 정답
1 2 3 4 5 6 7 | SELECT N, CASE WHEN P IS NULL THEN 'Root' WHEN N NOT IN (SELECT P FROM BST WHERE P IS NOT NULL) THEN 'Leaf' ELSE 'Inner' END FROM BST ORDER BY N | cs |
# 오답 vs. 정답
오답 | 정답 |
SELECT N, CASE WHEN P IS NULL THEN 'Root' WHEN (P IS NOT NULL) AND N NOT IN (SELECT P FROM BST) THEN 'Leaf' ELSE 'Inner' END FROM BST ORDER BY N |
SELECT N, CASE WHEN P IS NULL THEN 'Root' WHEN N NOT IN (SELECT P FROM BST WHERE P IS NOT NULL) THEN 'Leaf' ELSE 'Inner' END FROM BST ORDER BY N |
* 쿼리 해석 : P가 NULL이 아니면서 P에 포함되지 않으면 'Leaf'로 분류해라. * 문제점 : NOT IN(서브쿼리) 결과값에 NULL이 존재함 : NOT IN절에 NULL이 포함되면 UNKNOWN이 되어 FALSE가 반환되어 아무 결과도 나오지 않게 됨 그래서 전부 ELSE로 지정한 'Inner'로 출력됨 |
* 해결방법 : NOT IN(서브쿼리) 결과값에 NULL이 포함되지 않도록 IS NOT NULL 조건 걸어주기 또는, NOT EXISTS 를 사용해도 됨 |
https://day-to-day.tistory.com/22
[MySQL] NOT IN을 사용할 때 주의할 점 (+ EXISTS와 비교하기)
리트코드에서 나온 문제 중에 쉽게 사용해왔던 NOT IN을 사용하면서 겪었던 문제를 함께 공유하려고 한다. 지시 사항 Each node in the tree can be one of three types: "Leaf": if the node is a leaf node. "Root": if the no
day-to-day.tistory.com
배운점
메인쿼리 결과물과 서브쿼리 결과물을 비교하는 과정에서..
▶ IN / NOT IN
- IN : 서브쿼리와 메인쿼리의 값 중 하나라도 일치하면 반환
- NOT IN : 모든 요소들과 일치하지 않는 값을 반환
- (작동 원리) 서브쿼리에 있는 게 메인쿼리에도 있냐?
- (주의할 점) 서브쿼리 내 NULL값 존재 시 FALSE가 되어 아무것도 반환되지 않음
→ WHERE절에 IS NOT NULL 조건 주기
(하단 IN / NOT IN 박스의 파란 볼드 참고)
▶ EXISTS / NOT EXISTS
- EXISTS : 이하 절이 TRUE일 때 반환
- NOT EXISTS : 이하 절이 FALSE일 때 반환 (FALSE가 NOT을 만나 → TRUE가 되므로)
- (작동 원리) 메인쿼리에 있는 게 서브쿼리에도 있냐?
- (주의할 점) 메인쿼리에 있는 게 서브쿼리에도 있는지 확인하려면
서브쿼리를 메인쿼리와 이어줘야 함 → WHERE절로 조건 주기
(하단 EXISTS/ NOT EXISTS 박스의 초록 볼드 참고)
▶ IN / NOT IN, EXISTS / NOT EXISTS 차이점 비교
(예시) 문제 쿼리문 인용
IN / NOT IN | EXISTS / NOT EXISTS |
SELECT * FROM BST b1 WHERE b1.N NOT IN(SELECT b2.P FROM BST b2 WHERE b2.P IS NOT NULL) |
SELECT * FROM BST b1 WHERE b1.N NOT EXISTS(SELECT b2.P FROM BST b2 WHERE b1.P = b2.P) |
* 작동 원리 (1) 서브쿼리 테이블에 먼저 접근 (2) 서브쿼리 결과값 P를 모두 반환 단, NULL값 존재 시 FALSE가 되어 아무것도 반환되지 않음 (3) 메인쿼리 테이블의 레코드와 하나씩 비교하며 - IN의 경우 같은 것만 반환하고, - NOT IN의 경우 일치하지 않는 것만 반환 |
* 작동 원리 (1) 메인쿼리 테이블에 먼저 접근 (2) 메인쿼리 레코드를 하나 가져온 뒤 (3) 서브쿼리를 실행시켜 결과가 존재하는지 판단해 - EXISTS의 경우, TRUE면 결과 반환 - NOT EXISTS의 경우, FALSE면 결과 반환 이 때 NULL값은 서브쿼리를 FALSE로 만들기 때문에 NOT EXISTS의 반환 조건이 충족되어 같이 반환됨 |
https://velog.io/@wogud9675/MySQL-NOT-IN-%EA%B3%BC-NOT-EXISTS%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
[MySQL] NOT IN 과 NOT EXISTS의 차이점
IN은 조건에 만족하는 row를 찾는 것이고 EXISTS는 EXISTS이하 절이 true인지 아닌지를 체크합니다. 둘의 차이점은 Null 값을 처리하는 부분에서 발생합니다. NOT IN은 Null 값이 WHERE 절의 조건을 만족하더
velog.io
https://choihyuunmin.tistory.com/93
[SQL] (NOT)EXISTS 와 (NOT)IN 비교하기
최근 작업하고 있는 모듈에서 A 테이블과 B 테이블을 비교하여 B 테이블에 없는 값을 A 테이블에서 가져오는 작업을 진행하고 있다. 처음에는 NOT IN 구문을 사용하여 비교하고 가져오고 있었는데,
choihyuunmin.tistory.com
댓글