본문 바로가기

TIL 통합/SQL

[LEETCODE] Tree Node : DISTINCT - LEFT JOIN 활용

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