본문 바로가기
SQL/코딩테스트

[MySQL] SUB쿼리를 굳이 쓰지 않아도 되는 경우

by Nanki 2024. 11. 10.

문제 출처 : 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 문 안의 함수 적용 등)