【帰ってきた】SQL質疑応答スレ

このエントリーをはてなブックマークに追加
47NAME IS NULL
JET(Access2000) で、

親テーブル(主キー: id)
id | 名前
--+-----
1 | hoge
2 | foo

子テーブル(主キー: id, 好物 外部キー:id -> 親テーブル.id)
id | 好物
--+-----
1 | パン
1 | ハム
1 | 目玉焼き
2 | ごはん
2 | ハム
2 | 目玉焼き
2 | 黒酢

といった表から

id | 名前 | 好物
--+----+--------------------------
1 | hoge | パン,ハム,目玉焼き
2 | foo | ごはん,ハム,目玉焼き,黒酢

という仮想表を作りたいのですが、これを SQL のみで作ることは可能でしょうか。
好物の値の種類は今後増える可能性があります。好物のオーダーは通常の昇順です。
 クロス集計クエリの結果を JOIN する方法をはじめに思いついたのですが、
これだと一列にカンマ区切りなどでまとめられないことと、項目を動的に
増やすのに * を使うため id 列が2列になってしまうのがよくありませんでした。
48NAME IS NULL:2005/09/22(木) 18:40:42 ID:???
>>47
文字列を結合するような集合関数はない。あったら便利だとは思うが、
第一正規系を崩してしまうことになるからあえて実装を避けてるのかもしれない。
idで単純に結合してプログラムでid順に読み込みながら最終の形にするのが単純で効率もいい。
それ以外では問合せ結果を結合するストアドファンクションを自作する。Access2000ならVBAで作れる。
ただこの場合idの数だけ繰り返し子テーブルにクエリが発生するので実行効率はよくない。