노트1/SQL

[MySQL] HackerRank 문제풀이 : JOIN, 서브쿼리 (Binary Tree Nodes)

Paige09 2022. 2. 24. 23:14

https://www.hackerrank.com/challenges/binary-search-tree-1/problem

 

Binary Tree Nodes | HackerRank

Write a query to find the node type of BST ordered by the value of the node.

www.hackerrank.com

 

Root = 부모가 없음 = P컬럼 값이 NULL
Leaf = 자식이 없음 = 다른 값의 부모가 될 수 없음 = N컬럼의 값이 P컬럼에 존재하지 않음

 

 

1. LEFT JOIN을 이용한 풀이

 

LEFT JOIN 조건 (bst.N = bst2.P) 에 해당하지않는 경우 NULL값이 된다는 것을 이용!

                        = N컬럼의 값이 P컬럼에 없음 = Leaf

-- SELECT distinct bst.n, bst.p, bst2.n, bst2.p,
SELECT distinct bst.n,
    CASE WHEN bst.p IS NULL THEN 'Root'
         WHEN bst2.n IS NULL THEN 'Leaf'
         ELSE 'Inner'
    END as type
FROM bst
    LEFT JOIN bst as bst2 ON bst.n = bst2.p
ORDER BY bst.n

 

 

 

2. 서브쿼리를 이용한 풀이

 

SELECT n,
        CASE WHEN p IS NULL THEN 'Root' 
     	     WHEN n NOT IN (SELECT distinct p
                    	    FROM bst
                     	    WHERE p IS NOT NULL) THEN 'Leaf'
        ELSE 'Inner'
        END as type
FROM bst
ORDER BY n

 

n NOT IN (A, NULL) 일 때

n은 A도 아니고 NULL도 아니어야 하는데, 후자는 (n = NULL) 로 풀이되고

NULL 여부는 IS, IS NOT을 통해 판단해야하므로 (n = NULL)은 FALSE를 반환한다.

따라서  NOT IN (A, NULL)로는 아무런 결과도 나오지않는다.

 

IN을 쓸 때는 NULL에 주의할 것.