回答編集履歴

3

推敲

2021/02/20 05:48

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -1,4 +1,4 @@
1
- 再帰でnumの経路情報を取得して、その経路の先頭を経路に含むものという条件にする。
1
+ 再帰でnumの経路情報を取得して、その経路の先頭が同じものという条件にする。
2
2
 
3
3
  ```SQL
4
4
 
@@ -24,9 +24,9 @@
24
24
 
25
25
  select * from tre
26
26
 
27
- where lvl_num @> (
27
+ where lvl_num[1] = (
28
28
 
29
- select array[lvl_num[1]] from tre where num =3
29
+ select lvl_num[1] from tre where num =3
30
30
 
31
31
  )
32
32
 

2

追記

2021/02/20 05:48

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -33,3 +33,5 @@
33
33
  order by lvl_num
34
34
 
35
35
  ```
36
+
37
+ 尚、再帰を前提にするならnextnumは不要です。

1

訂正

2021/02/20 00:51

投稿

sazi
sazi

スコア25327

test CHANGED
@@ -1,3 +1,35 @@
1
- 再帰をネストすれば良さそうけど
1
+ 再帰でnumの経路情報取得して、の経路の先頭を経路に含むものとい条件に
2
2
 
3
+ ```SQL
4
+
5
+ with recursive tre as(
6
+
7
+ select *, array[num] as lvl_num
8
+
9
+ from LINKED_LIST_TABLE
10
+
11
+ where prevnum is null
12
+
13
+ union all
14
+
15
+ select lnk.* , tre.lvl_num || lnk.num
16
+
17
+ from LINKED_LIST_TABLE lnk
18
+
19
+ inner join tre
20
+
21
+ on tre.num=lnk.prevnum
22
+
23
+ )
24
+
25
+ select * from tre
26
+
27
+ where lvl_num @> (
28
+
3
- 一度目の再帰でnumの経路情報を取得して経路の先頭を求めて、その経路の先頭を条件にまた再帰する。
29
+ select array[lvl_num[1]] from tre where num =3
30
+
31
+ )
32
+
33
+ order by lvl_num
34
+
35
+ ```