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

回答編集履歴

1

「回答への修正依頼・コメント」に対して、回答を追記した。

2023/10/15 11:08

投稿

neko_the_shadow
neko_the_shadow

スコア2395

answer CHANGED
@@ -29,4 +29,44 @@
29
29
  SELECT ROW_NUMBER() OVER (ORDER BY root, lvl, code) seq, lvl, code
30
30
  FROM R
31
31
  ORDER BY seq
32
+ ```
33
+
34
+ ---
35
+ **2023-10-05 20:05追記**
36
+
37
+ >表示順だけをtest01直下のseq順にならないでしょうか? 申し訳ございません。
38
+
39
+ >seqはデータに持っていないと言っていたのですが 持っていました。
40
+
41
+ テーブル定義とサンプルデータは次のようになっていたということですかね?
42
+
43
+ ```SQL
44
+ CREATE TABLE CSM070STRC (master VARCHAR(6), child VARCHAR(6), seq INT);
45
+ INSERT INTO CSM070STRC VALUES ('test01', '8387' , 1 );
46
+ INSERT INTO CSM070STRC VALUES ('8387' , '8388' , 2 );
47
+ INSERT INTO CSM070STRC VALUES ('8387' , 'A0752', 2 );
48
+ INSERT INTO CSM070STRC VALUES ('test01', '8426' , 2 );
49
+ INSERT INTO CSM070STRC VALUES ('8426' , '5049' , 7 );
50
+ INSERT INTO CSM070STRC VALUES ('8426' , '5050' , 8 );
51
+ INSERT INTO CSM070STRC VALUES ('8426' , '4132' , 9 );
52
+ INSERT INTO CSM070STRC VALUES ('8426' , '1271' , 10);
53
+ INSERT INTO CSM070STRC VALUES ('8426' , '4248' , 11);
54
+ INSERT INTO CSM070STRC VALUES ('test01', '8392' , 3 );
55
+ INSERT INTO CSM070STRC VALUES ('8392' , '8393' , 6 );
56
+ INSERT INTO CSM070STRC VALUES ('8392' , 'A0752', 7 );
57
+ ```
58
+
59
+ 必要な結果を求めるSQLは以下の様になると思います。
60
+
61
+ ```SQL
62
+ WITH R (root_seq, code, seq, lvl) AS (
63
+ SELECT seq, child, seq, 1 FROM CSM070STRC WHERE master = 'test01'
64
+ UNION ALL
65
+ SELECT R.root_seq, C.child, C.seq, R.lvl+1
66
+ FROM R
67
+ JOIN CSM070STRC C ON R.code = C.master
68
+ )
69
+ SELECT ROW_NUMBER() OVER (ORDER BY root_seq, lvl, seq) 行, lvl, code
70
+ FROM R
71
+ ORDER BY 行
32
72
  ```