回答編集履歴

2

階層レベルが経路情報であることを記載しました。2階層上のレコードの出力例を記載しました。

2020/06/14 10:31

投稿

etsuhisa
etsuhisa

スコア416

test CHANGED
@@ -1,4 +1,4 @@
1
- 単純な方法としては、以下のような階層レベルを管理するテーブルを作成する方法が考えられます。
1
+ 単純な方法としては、以下のような階層レベル(経路情報)を管理するテーブルを作成する方法が考えられます。
2
2
 
3
3
  ```SQL
4
4
 
@@ -155,3 +155,55 @@
155
155
  - 冗長なデータを持つ必要がある。
156
156
 
157
157
  - 行数が階層の深さなどに依存して多くなる。
158
+
159
+
160
+
161
+ 【補足】
162
+
163
+ 2階層以上の場合の出力例について説明します。
164
+
165
+ 仮に質問の階層構造のテーブルのBのフラグが1で、Cのフラグが0の場合には以下のようにC、D、Fの上位階層の情報が表示できます。
166
+
167
+ |ID|名称|親ID|フラグ|
168
+
169
+ |:--|:--:|--:|--:|
170
+
171
+ |1|A|null|0|
172
+
173
+ |2|B|1|**1**|
174
+
175
+ |3|C|2|**0**|
176
+
177
+ |4|D|3|0|
178
+
179
+ |5|E|1|1|
180
+
181
+ |6|F|5|0|
182
+
183
+ |7|G|1|0|
184
+
185
+
186
+
187
+ ```SQL
188
+
189
+ select * from 階層レベル a inner join 階層構造のテーブル b on a.上位ID=b.ID inner join 階層構造のテーブル c on a.ID=c.ID where b.フラグ=1 and a.ID<>b.ID;
190
+
191
+ <= a(階層レベルの情報) => <==== b(フラグが1の名称) ===> <=== c(自レコードの情報) ===>
192
+
193
+ +------+--------+--------+------+------+------+--------+------+------+------+--------+
194
+
195
+ | ID | レベル | 上位ID | ID | 名称 | 親ID | フラグ | ID | 名称 | 親ID | フラグ |
196
+
197
+ +------+--------+--------+------+------+------+--------+------+------+------+--------+
198
+
199
+ | 3 | 2 | 2 | 2 | B | 1 | 1 | 3 | C | 2 | 0 |
200
+
201
+ | 4 | 2 | 2 | 2 | B | 1 | 1 | 4 | D | 3 | 0 |
202
+
203
+ | 6 | 2 | 5 | 5 | E | 1 | 1 | 6 | F | 5 | 0 |
204
+
205
+ +------+--------+--------+------+------+------+--------+------+------+------+--------+
206
+
207
+ ```
208
+
209
+ ※わかりやすいように、階層構造のテーブルの自レコードの情報をcとして追加しました。

1

質問に合わせたSQLを記載しました。また質問で利用しやすいようinsert文を修正しました。

2020/06/14 10:31

投稿

etsuhisa
etsuhisa

スコア416

test CHANGED
@@ -10,9 +10,9 @@
10
10
 
11
11
  ```SQL
12
12
 
13
- insert into 階層レベル values(<自分のID>,0,<親ID>);
13
+ insert into 階層レベル select <自分のID>,レベル,上位ID from 階層レベル where ID=<親ID>;
14
14
 
15
- insert into 階層レベル select <自分のID>,レベル+1,上位ID from 階層レベル where ID=<ID>;
15
+ insert into 階層レベル select <自分のID>,max(レベル)+1,<自分のID> from 階層レベル where ID=<自分のID>;
16
16
 
17
17
  ```
18
18
 
@@ -20,29 +20,31 @@
20
20
 
21
21
  ```SQL
22
22
 
23
- insert into 階層レベル values(2,0,1);
23
+ insert into 階層レベル values(1,1,1);
24
24
 
25
- insert into 階層レベル select 2,レベル+1,上位ID from 階層レベル where ID=1;
25
+ insert into 階層レベル select 2,レベル,上位ID from 階層レベル where ID=1;
26
26
 
27
- insert into 階層レベル values(3,0,2);
27
+ insert into 階層レベル select 2,max(レベル)+1,2 from 階層レベル where ID=2;
28
28
 
29
- insert into 階層レベル select 3,レベル+1,上位ID from 階層レベル where ID=2;
29
+ insert into 階層レベル select 3,レベル,上位ID from 階層レベル where ID=2;
30
30
 
31
- insert into 階層レベル values(4,0,3);
31
+ insert into 階層レベル select 3,max(レベル)+1,3 from 階層レベル where ID=3;
32
32
 
33
- insert into 階層レベル select 4,レベル+1,上位ID from 階層レベル where ID=3;
33
+ insert into 階層レベル select 4,レベル,上位ID from 階層レベル where ID=3;
34
34
 
35
- insert into 階層レベル values(5,0,1);
35
+ insert into 階層レベル select 4,max(レベル)+1,4 from 階層レベル where ID=4;
36
36
 
37
- insert into 階層レベル select 5,レベル+1,上位ID from 階層レベル where ID=1;
37
+ insert into 階層レベル select 5,レベル,上位ID from 階層レベル where ID=1;
38
38
 
39
- insert into 階層レベル values(6,0,5);
39
+ insert into 階層レベル select 5,max(レベル)+1,5 from 階層レベル where ID=5;
40
40
 
41
- insert into 階層レベル select 6,レベル+1,上位ID from 階層レベル where ID=5;
41
+ insert into 階層レベル select 6,レベル,上位ID from 階層レベル where ID=5;
42
42
 
43
- insert into 階層レベル values(7,0,1);
43
+ insert into 階層レベル select 6,max(レベル)+1,6 from 階層レベル where ID=6;
44
44
 
45
- insert into 階層レベル select 7,レベル+1,上位ID from 階層レベル where ID=1;
45
+ insert into 階層レベル select 7,レベル,上位ID from 階層レベル where ID=1;
46
+
47
+ insert into 階層レベル select 7,max(レベル)+1,7 from 階層レベル where ID=7;
46
48
 
47
49
  ```
48
50
 
@@ -58,27 +60,91 @@
58
60
 
59
61
  +------+--------+--------+
60
62
 
61
- | 2 | 0 | 1 |
63
+ | 1 | 1 | 1 |
62
64
 
65
+ | 2 | 1 | 1 |
66
+
63
- | 3 | 0 | 2 |
67
+ | 2 | 2 | 2 |
64
68
 
65
69
  | 3 | 1 | 1 |
66
70
 
67
- | 4 | 0 | 3 |
71
+ | 3 | 2 | 2 |
68
72
 
69
- | 4 | 1 | 2 |
73
+ | 3 | 3 | 3 |
70
74
 
71
- | 4 | 2 | 1 |
75
+ | 4 | 1 | 1 |
72
76
 
73
- | 5 | 0 | 1 |
77
+ | 4 | 2 | 2 |
74
78
 
79
+ | 4 | 3 | 3 |
80
+
81
+ | 4 | 4 | 4 |
82
+
83
+ | 5 | 1 | 1 |
84
+
75
- | 6 | 0 | 5 |
85
+ | 5 | 2 | 5 |
76
86
 
77
87
  | 6 | 1 | 1 |
78
88
 
89
+ | 6 | 2 | 5 |
90
+
91
+ | 6 | 3 | 6 |
92
+
79
- | 7 | 0 | 1 |
93
+ | 7 | 1 | 1 |
94
+
95
+ | 7 | 2 | 7 |
80
96
 
81
97
  +------+--------+--------+
98
+
99
+ ```
100
+
101
+
102
+
103
+ フラグが1の名称の取得は以下のとおりです。
104
+
105
+ ```SQL
106
+
107
+ select * from 階層レベル a inner join 階層構造のテーブル b on a.上位ID=b.ID where b.フラグ=1 and a.ID<>b.ID;
108
+
109
+ +------+--------+--------+------+------+------+--------+
110
+
111
+ | ID | レベル | 上位ID | ID | 名称 | 親ID | フラグ |
112
+
113
+ +------+--------+--------+------+------+------+--------+
114
+
115
+ | 4 | 3 | 3 | 3 | C | 2 | 1 |
116
+
117
+ | 6 | 2 | 5 | 5 | E | 1 | 1 |
118
+
119
+ +------+--------+--------+------+------+------+--------+
120
+
121
+ ```
122
+
123
+ レベル2の名称の取得は以下のとおりです。
124
+
125
+ ```SQL
126
+
127
+ select * from 階層レベル a inner join 階層構造のテーブル b on a.上位ID=b.ID where a.レベル=2;
128
+
129
+ +------+--------+--------+------+------+------+--------+
130
+
131
+ | ID | レベル | 上位ID | ID | 名称 | 親ID | フラグ |
132
+
133
+ +------+--------+--------+------+------+------+--------+
134
+
135
+ | 2 | 2 | 2 | 2 | B | 1 | 0 |
136
+
137
+ | 3 | 2 | 2 | 2 | B | 1 | 0 |
138
+
139
+ | 4 | 2 | 2 | 2 | B | 1 | 0 |
140
+
141
+ | 5 | 2 | 5 | 5 | E | 1 | 1 |
142
+
143
+ | 6 | 2 | 5 | 5 | E | 1 | 1 |
144
+
145
+ | 7 | 2 | 7 | 7 | G | 1 | 0 |
146
+
147
+ +------+--------+--------+------+------+------+--------+
82
148
 
83
149
  ```
84
150