03/18 SQL 문제풀이 - 608. Tree Node (Leetcode) ⭐⭐⭐

Data Architect / Engineer·2024년 3월 18일
1

1일_1SQL

목록 보기
54/63
post-thumbnail

문제

  • 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의 논리적 순서 기억하기
profile
질문은 계속돼 아오에

0개의 댓글