문제 출처 : 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
풀이 매크로
1. 문제 풀이조건 정의
1) P가 NULL이면 'Root'
2) DISTINCT P의 값이 N에 있으면 INNER
3) DISTINCT P의 값이 N에 없으면 Leaf
2.
- 1)은 기존 테이블인 P가 NULL일 때 'Root'
- 2),3)은 DISTINCT의 P의값이 N에 있는지확인 -> Self join 활용
DISTINCT의 P의값을 A에 LEFT JOIN > 값이 있고 없고로 INNER 와 Leaf를 나눠야하므로
3. 1),2),3)의 조건에 맞게 CASE WHEN~ END 문 작성
4. 문제의 조건대로 N의 오름차순 정렬
SELECT A.N
-- , A.P
,CASE
WHEN A.P IS NULL THEN 'Root'
WHEN B.P IS NOT NULL THEN 'Inner'
WHEN B.P IS NULL THEN 'Leaf'
END
FROM BST AS A
LEFT JOIN (
SELECT DISTINCT P
FROM BST
) AS B ON A.N = B.P
ORDER BY A.N
;
다른 풀이(데이터리안님 풀이)
SELECT DISTINCT A.N
-- , A.P
,CASE
WHEN A.P IS NULL THEN 'Root'
WHEN B.P IS NOT NULL THEN 'Inner'
WHEN B.P IS NULL THEN 'Leaf'
END
FROM BST AS A
LEFT JOIN BST AS B ON A.N = B.P
ORDER BY A.N
;
LEFT JOIN 시 중복 행이 존재한다면 불필요한 중복행을 출력한다. 이에 DISTINCT를 SELECT문에 준다. 이는 위의 LEFT JOIN 의 SUB 쿼리안에 DISTINCT를 주는 것과 같은 효과가 된다.
배운 점
- SUB 쿼리안에 굳이 조건 WHERE이나 GROUP BY/HAVING을 줘야할 상황이 아니라면 / 즉 SELECT 문에서 해결이 가능한 경우 sub쿼리가 아니라 일반 self 쿼리로도 해결이가능하다. (DISTINCT, SELECT 문 안의 함수 적용 등)
'SQL > 코딩테스트' 카테고리의 다른 글
[MySQL] 176. Second Highest Salary (0) | 2025.03.13 |
---|---|
[MySQL] SubQuery 활용법 (0) | 2024.11.11 |
[MySQL] 하나의 테이블에 두개의 키 변수를 이용해 Join 하기 (0) | 2024.11.09 |
[MySQL] SQL 문제에서 문제정의방법 (1) | 2024.11.08 |
[MySQL] TRUNCATE와 WHERE 조건 범위 (0) | 2024.11.08 |