質問の回答
昨日の回答の続き。
前提
ここで言っているアンケートはこんな感じ。
1,質問文1
2,質問文2
3,質問文3
つまり、質問文がただ並列に並んでいるだけで入れ子の状態。
1,質問文1
1−1 質問文1−1
1−2 質問文1−2
2,質問文2
3,質問文3
のようにならないこと。
このような場合があり得る場合は質問明細明細番号のようなカラムを追加しておくことで対処する。
1,質問文1
のような場合はその質問明細明細番号は0にするとかルールを決めておけばプログラム言語側で対処できる問題であると考える。
一つの解決方法
複数回アンケートを採ったときはこのように取得します。
たとえば第一回目のすべてのアンケートを取るにはこう。
前項であげた質問文1とか質問文2とか言うところが質問明細番号に相当し何回目のアンケートかというところが質問番号にそうとうする。日本語がまずかったらよいと思われる表現方法に改めるとよろしいかと。
select * from 質問 where 質問番号 = '1' order by 回答者,質問番号,質問明細番号
正規化という意味では質問文を質問番号として質問文テーブルなるものを定義するとよいかと思います。回答者もそれが限られた人ならば回答者マスタみたいのを作って質問テーブルには回答者番号とするとよいでしょう。
create table 質問文(
質問番号 varchar2(10),
質問明細番号 varchar2(3),
質問文 varchar2(400),
primary key (質問番号,質問明細番号)
)
create table 質問(
質問番号 varchar2(10),
質問明細番号 varchar2(3),
回答者 varchar2(20),
回答文 varchar2(400),
primary key (質問番号,質問明細番号,回答者)
)
こういった場合ですと2回目のアンケートを取るには
select
質問.質問番号,
質問.質問明細番号,
質問文.質問文,
質問.回答者,
質問.回答文
from
質問,質問文
where
質問文.質問番号 = 質問.質問番号 and
質問文.質問明細番号 = 質問.質問明細番号 and
質問文.質問番号 = '2'
order by
質問.回答者,
質問.質問番号,
質問.質問明細番号
のようなクエリでよいと思う。すると次のようなイメージでとれてくるものと思われる。
質問.質問番号 | 質問.質問明細番号 | 質問文.質問文 | 質問.回答者 | 質問.回答文 |
---|---|---|---|---|
2 | 1 | hoge1 | kaito1 | fuga1 |
2 | 2 | hoge2 | kaito1 | fuga2 |
2 | 3 | hoge3 | kaito1 | fuga3 |
2 | 1 | hoge1 | kaito2 | fuga4 |
2 | 2 | hoge2 | kaito2 | fuga5 |
2 | 3 | hoge3 | kaito2 | fuga6 |
あとは、プログラム言語側で望む形に整形して表示してあげればよろしいかと。