문제 출처 : https://www.hackerrank.com/challenges/binary-search-tree-1/problem
풀이 매크로
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] SubQuery 활용법 (0) | 2024.11.11 |
---|---|
[MySQL] 하나의 테이블에 두개의 키 변수를 이용해 Join 하기 (0) | 2024.11.09 |
[MySQL] SQL 문제에서 문제정의방법 (1) | 2024.11.08 |
[MySQL] TRUNCATE와 WHERE 조건 범위 (0) | 2024.11.08 |
[MySQL] SUBSTR/REGEXP/LEFT/RIGHT 문자열 다루기 (1) | 2024.11.08 |