teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

推敲

2021/02/20 05:48

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -1,4 +1,4 @@
1
- 再帰でnumの経路情報を取得して、その経路の先頭を経路に含むものという条件にする。
1
+ 再帰でnumの経路情報を取得して、その経路の先頭が同じものという条件にする。
2
2
  ```SQL
3
3
  with recursive tre as(
4
4
  select *, array[num] as lvl_num
@@ -11,8 +11,8 @@
11
11
  on tre.num=lnk.prevnum
12
12
  )
13
13
  select * from tre
14
- where lvl_num @> (
14
+ where lvl_num[1] = (
15
- select array[lvl_num[1]] from tre where num =3
15
+ select lvl_num[1] from tre where num =3
16
16
  )
17
17
  order by lvl_num
18
18
  ```

2

追記

2021/02/20 05:48

投稿

sazi
sazi

スコア25430

answer CHANGED
@@ -15,4 +15,5 @@
15
15
  select array[lvl_num[1]] from tre where num =3
16
16
  )
17
17
  order by lvl_num
18
- ```
18
+ ```
19
+ 尚、再帰を前提にするならnextnumは不要です。

1

訂正

2021/02/20 00:51

投稿

sazi
sazi

スコア25430

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