
문제
- 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의 논리적 순서 기억하기