-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path608.sql
55 lines (47 loc) · 1.36 KB
/
608.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
-- [ LeetCode ] 608. Tree Node
SELECT
Tree.id AS id,
CASE
WHEN Tree.p_id IS NULL THEN 'Root'
WHEN (
Tree.p_id IS NOT NULL
AND
Nodes.id IS NOT NULL
) THEN 'Inner'
ELSE 'Leaf'
END AS type
FROM Tree
LEFT JOIN Tree AS Nodes
ON Tree.id = Nodes.p_id
GROUP BY Tree.id
ORDER BY id ASC;
/*
이미 첫 번째 WHEN 부분에서 p_id 필드의 값이 `NULL`인지 여부를 판단하기 때문에
그 다음 WHEN 부분에 따로 `IS NOT NULL`과 같은 표현식을 작성할 필요가 없다.
*/
SELECT
Tree.id AS id,
CASE
WHEN Tree.p_id IS NULL THEN 'Root'
WHEN Nodes.id IS NOT NULL THEN 'Inner'
ELSE 'Leaf'
END AS type
FROM Tree
LEFT JOIN Tree AS Nodes
ON Tree.id = Nodes.p_id
GROUP BY Tree.id
ORDER BY id ASC;
/*
더 간단하게 아래와 같이 서브쿼리를 활용하여 굳이 LEFT JOIN 구를 사용하지 않아도 문제를 해결할 수 있다.
아래와 같이 문제를 풀면 속도 또한 훨씬 빠르다.
문제를 접근할 때 JOIN 구를 써야하는 이유에 대해서, 서브쿼리로 대신할 수 없는지에 대해서 한번 생각해보면 좋을 것 같다.
*/
SELECT
id,
CASE
WHEN p_id IS NULL THEN 'Root'
WHEN id IN (SELECT DISTINCT p_id FROM Tree) THEN 'Inner'
ELSE 'Leaf'
END AS type
FROM Tree
ORDER BY id ASC;