回答編集履歴

1

追記

2017/07/04 21:12

投稿

hatena19
hatena19

スコア33753

test CHANGED
@@ -7,3 +7,167 @@
7
7
 
8
8
 
9
9
  エラーが出たほうのSQLをデザインビューにして、その画像を添付してもらえますか。
10
+
11
+
12
+
13
+ コメントを受けて追記
14
+
15
+ ---
16
+
17
+
18
+
19
+ 質問者さんの 2017/07/03 15:53コメントから引用
20
+
21
+ ```
22
+
23
+ public_groupandpeople
24
+
25
+ *parentid *childid
26
+
27
+ ----------------------------
28
+
29
+ GR0000 GR0001
30
+
31
+ GR0000 GR0002
32
+
33
+ GR0000 GR0003
34
+
35
+ GR0001 GR0001X
36
+
37
+ GR0001 GR0001Y
38
+
39
+ GR0002 GR0002X
40
+
41
+ GR1000 GR1001
42
+
43
+ GR1001 GR1001X
44
+
45
+ GR1001 GR1001Y
46
+
47
+
48
+
49
+ ```
50
+
51
+ このテーブルは下記のような階層モデルを表していると思います。
52
+
53
+
54
+
55
+ ```
56
+
57
+ GR0000┬GR0001┬GR0001X
58
+
59
+    │   └GR0001Y
60
+
61
+    ├GR0002─GR0002X
62
+
63
+    └GR0003
64
+
65
+ GR1000─GR1001┬GR1001X
66
+
67
+        └GR1001Y
68
+
69
+ ```
70
+
71
+ これから、GR0000配下にあるグループID を取得するには、下記のSQLになります。
72
+
73
+
74
+
75
+ ```SQL
76
+
77
+ SELECT DISTINCT parentid
78
+
79
+ FROM public_groupandpeople
80
+
81
+ WHERE parentid='GR0000'
82
+
83
+ UNUON ALL
84
+
85
+ SELECT childid
86
+
87
+ FROM public_groupandpeople
88
+
89
+ WHERE parentid="GR0000"
90
+
91
+ UNUON ALL
92
+
93
+ SELECT T1.childid
94
+
95
+ FROM public_groupandpeople T1 INNER JOIN public_groupandpeople T2
96
+
97
+ ON T1.parentid = T2.childid
98
+
99
+ WHERE T2.parentid="GR0000";
100
+
101
+ ```
102
+
103
+ ルート階層のデータ
104
+
105
+ UNION ALL
106
+
107
+ 1階層下のデータ
108
+
109
+ UNION ALL
110
+
111
+ 2階層下のデータ;
112
+
113
+
114
+
115
+ という構成になっています。
116
+
117
+
118
+
119
+ このSQLをクエリとして保存します。名前はQ1とします。
120
+
121
+
122
+
123
+ ```SQL
124
+
125
+ SELECT Q1.parentid, T1.group_name
126
+
127
+ FROM Q1 INNER JOIN public_groups T1 ON Q1.parentid = T1.group_id;
128
+
129
+ ```
130
+
131
+ 出力結果
132
+
133
+ ```
134
+
135
+ parentid group_name
136
+
137
+ ---------------------
138
+
139
+ GR0000 グループA
140
+
141
+ GR0001 グループB
142
+
143
+ GR0002 グループC
144
+
145
+ GR0003 グループD
146
+
147
+ GR0001X グループE
148
+
149
+ GR0001Y グループF
150
+
151
+ GR0002X グループG
152
+
153
+ ```
154
+
155
+ GR0000配下のグループデータが出力されます。
156
+
157
+
158
+
159
+ Q1をサブクエリにすれば一つのクエリに纏められます。
160
+
161
+
162
+
163
+ SQLで階層モデルを表現するのは難しいです。現状のテーブル設計が最適とはいえないかもしれません。下記辺りを参考にして設計を再考するのもいいかもしれません。
164
+
165
+
166
+
167
+ [階層構造データへの挑戦 - Qiita](http://qiita.com/uchinami_shoichi/items/5fa52f340003107d46c1)
168
+
169
+ [Fertile Forest Model (ツリー構造データをRDBで扱うための第五のモデル) - Qiita](http://qiita.com/StewEucen/items/e0487c39285a9d6b7863)
170
+
171
+
172
+
173
+