문제
https://www.hackerrank.com/challenges/binary-search-tree-1/problem
코드
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 |