문제
- LeetCode SQL 문제
608. Tree Node / Medium
- 문제 내용 : [링크]
내가 작성한 Query
with temp_01 as( select a.id, b.id as bottom, a.p_id as top from tree a left join tree b on a.id = b.p_id ) select id , max(case when top is null then 'Root' when bottom is null then 'Leaf' else 'Inner' end) as type from temp_01 group by id
그래프를 보고 해당 노드의 type
이 'Root', 'Inner', 'Leaf' 인지 판별하는 문제이다.
먼저 tree(upper a)
테이블과 tree(lower b)
테이블을 LEFT JOIN
해 준다. (on a.id = b.p_id
) 이 테이블을 temp_01
로 지정한다.
기준 노드 id(a.id
), 아래 노드 id (b.id
), 상위 노드 id(a.p_id
)를 SELECT
해 준다. (각각 id
, bottom
, top
컬럼명으로 출력)
temp_01
테이블에서 id
기준 GROUP BY
해 준다.
이후, CASE WHEN THEN
구문을 활용, top
이 없으면 'Root', bottom
이 없으면 'Leaf', 나머지는 'Inner'로 type
출력해준다.
(id
기준 GROUP BY
해주었으므로, MAX()
활용하여 출력한다. 똑같은 문자열이므로 MIN()
도 상관없음)
⭐ 왜 LEFT JOIN
인가?
LEFT JOIN
해준다.JOIN
할 경우, Root
를 데이터를 얻을 수 없음.)⭐ CASE WHEN THEN
순서는 중요하다!
bottom
을 먼저 'Leaf'로 출력한다면, 노드가 1개인 경우, 'Root'가 아닌 'Leaf'로 출력된다.⭐⭐⭐
LEFT JOIN
을 왜 활용해야 하는지, CASE WHEN THEN
의 논리적 순서 기억하기