문제
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
코드
SELECT DISTINCT BST.n, CASE WHEN BST.p IS NULL THEN 'Root' WHEN BST2.n IS NULL THEN 'Leaf' ELSE 'Inner' END FROM BST LEFT JOIN BST AS BST2 ON BST.n=BST 2.p ORDER BY BST.n |
설명
- BST 의 p 값이 null 이면 Root 을 출력하는데, 이는 CASE 문의 첫번째로 표현되었다.
- BST 의 Leaf 는 자신을 부모로 생각하는 값, 즉 n 값이 p 에 없는 노드이다.
이는 LEFT JOIN 을 이용하여 풀었다.
BST.n 과 BST2.p 가 같은 것을 조건으로 LEFT JOIN 을 걸면
왼쪽(BST.n)의 값과 같은 오른쪽(BST2.p)값이 여러개가 매칭된 테이블이 나온다.
LEFT JOIN 이기 때문에, n 값이 p 에 없으면 BST2의 n,p 값이 모두 null 로 찍힌다.
따라서 CASE 문의 두번째로 표현할 수 있다.
- 그 외의 경우는 모두 Inner 이기 때문에 ELSE 로 표현하였다.
- 먼저 출력되는 BST.n 값에 distinct 를 걸면, 중복이 없는 BST.n 을 기준으로 (뒤의 출력되는) CASE 이 실행된다.
이 사실을 몰랐더라면, 아마 나는 위의 쿼리 자체를 서브 쿼리로 만들어 select distinct 를 씌웠을 것 같다...
'SQL' 카테고리의 다른 글
[SQL] Hacker Rank Top Competitors 쿼리 설명 (0) | 2021.07.01 |
---|---|
[SQL] Hacker Rank Placements 쿼리 설명 (0) | 2021.07.01 |
[SQL] Min 과 Order By limit 1 중 어느 것을 사용해야 할까? (0) | 2021.06.19 |
[SQL] cheating sheet 정리 (0) | 2020.12.21 |
[SQL] null 일 때 다른값을 기준으로 정렬하기(order by) (0) | 2020.05.14 |