leet code sql 608
문제
- 각 노드 별 Parent 정보가 주어진다.
- 각 Node가 Root, Leaf, Inner인지 구별하여 출력
- 순서는 상관 없다.
문제 접근
- Root인 경우 = parent_id가 null 인 경우
- Leaf인 경우 = parent_id가 null 인 경우
- Inner = 나머지 경우
- 이 때 각 노드에 해당되는 값을 알기 위해 Left join 활용
- Distinct vs Group by
- Distinct는 그룹핑만
- Group by는 그룹핑 + 정렬 과정
1
2
3
4
5
6
7
8
9
a.id,
case when a.p_id is null then 'Root'
when b.p_id is null then 'Leaf'
else 'Inner'
end as type
from Tree a
left join Tree b
on a.id = b.p_id
group by 1, 2
신박하게 푼 사람의 아이디어를 가져와보았다.
if ( 조건, 성공한 경우, 실패한 경우) 를 활용하여 위의 경우를 표현
하지만, 속도 측면에서는 매우 느렸다.. 빠르다고 된건지 모르곘다.
1
2
3
4
select
distinct t.id,
if(t.p_id is null,'Root',if(t.id=p.p_id,'Inner','Leaf')) as type
from tree t left join tree p on t.id=p.p_id;