https://leetcode.com/problems/tree-node/
제목 그대로 트리 노드를 테이블로 산출하는 문제.
예전에 셀프 조인을 모를 때 비슷한 문제를 처음 접해서 한참 고민하다가 결국 문제풀이를 봤었는데, 이렇게 다시 비슷한 유형을 접하니 신기하다.
좀 더 직관적으로 출력물을 확인할 겸 제대로 된 학습을 수 있게 'Child'칼럼을 만들어서 진행했다.
[풀이1] LEFT JOIN 및 GROUP BY 활용
SELECT T1.ID
,T2.ID AS CHILD
,CASE WHEN T1.P_ID IS NULL THEN 'Root'
WHEN T2.ID IS NULL THEN 'Leaf'
ELSE 'Inner' END AS TYPE
FROM TREE T1
LEFT JOIN TREE T2
ON T1.ID = T2.P_ID
----------------------------------------그룹바이로 LEFT JOIN의 중복 열 제거
SELECT T1.ID
,MAX(CASE WHEN T1.P_ID IS NULL THEN 'Root'
WHEN T2.ID IS NULL THEN 'Leaf'
ELSE 'Inner' END) AS TYPE
FROM TREE T1
LEFT JOIN TREE T2
ON T1.ID = T2.P_ID
GROUP BY 1
근데 부모-자식 간 관계가 일대다인 경우가 있어서 아래처럼 출력되는 것을 방지하기 위해 마지막에 그룹바이를 처리해줬는데 최선은 아닌 것 같아서 고민하다가 다른 풀이들을 찾아봤다.
[풀이2] LEFT JOIN과 DISTINCT 활용
DISTINCT를 이렇게 활용할 수 있다는 것을 처음 알게 해준 풀이! 앞으로 자주 써먹어야겠다.
SELECT DISTINCT T1.ID
,CASE WHEN T1.P_ID IS NULL THEN 'Root'
WHEN T2.ID IS NULL THEN 'Leaf'
ELSE 'Inner' END AS TYPE
FROM TREE T1
LEFT JOIN TREE T2
ON T1.ID = T2.P_ID
[풀이3] 서브쿼리, IN, NOT IN, EXISTS 등 사용
SELECT ID
,CASE WHEN P_ID IS NULL THEN 'Root'
WHEN ID IN (SELECT P_ID FROM TREE) THEN 'Inner'
ELSE 'Leaf' END AS TYPE
FROM TREE
*주의사항
SELECT ID
,CASE WHEN P_ID IS NULL THEN 'Root'
WHEN ID NOT IN (SELECT P_ID FROM TREE WHERE P_ID IS NOT NULL) THEN 'Leaf'
ELSE 'Inner' END AS TYPE
FROM TREE
-------------------아래처럼 IS NOT NULL을 할 경우 에러남
SELECT ID
,CASE WHEN P_ID IS NULL THEN 'Root'
WHEN ID NOT IN (SELECT P_ID FROM TREE) THEN 'Leaf'
ELSE 'Inner' END AS TYPE
FROM TREE
'TIL 통합 > SQL' 카테고리의 다른 글
[HackerRank]Weather Observation Station 20 - MySQL에서 중앙값 구하기 (0) | 2025.04.15 |
---|---|
[SOLVESQL] 스테디 셀러 작가 찾기 - DISTINCT와 윈도우함수 (0) | 2025.04.11 |
[LEETCODE] [MySQL] Use window function for big data - LEAD(), LAG() 함수 (0) | 2025.04.07 |
[LEETCODE] 262. Trips and Users: WHERE절 활용 (0) | 2025.04.07 |
[LEETCODE] PRODUCT SALES ANALYSIS 3 - WHERE 응용 (0) | 2025.04.05 |