テーブルXが以下のようになっており、
IDa IDb
----------------
1 b1
1 b2
1 b3
2 b4
2 b5
3 b6
次のような結果を得たいと考えています。
SELECT文1本で書ける方法はありますでしょうか?
1 b1 b2 b3
2 b4 b5
3 b6
PostgreSQLを使用しています。
select IDa,IDb from テーブルx where IDb like 'b%';
では如何でしょうか?
それだと、結果が
1 b1
1 b2
1 b3
2 b4
2 b5
3 b6
にならないでしょうか?
ちなみに、列数が合わない空欄部分はNullが出力されればOKです。
sqlではここまでにして、後はphpなどで加工した方が
早いような気がします。
頻繁に使うようであれば、引き出したいデータ形式にした
テーブルを作成しリレーションされては如何でしょうか?
早いかどうかは問題でなく、今回の質問の主題は、これらをSQLで出来ないか、ということです。
もともと、サマリー用のテーブルを用意する、プログラムで加工するなどの手法を考えていました。
ピントのずれた回答はご勘弁ください。
select ida, array(select idb from x as x2 where x.ida=x2.ida) from x;
では駄目でしょうか?
あ、なるほど。
配列と自己結合使えばいいんですね!これは思いつきませんでした。
先ほど試してみたら、
1 b1 b2 b3
1 b1 b2 b3
1 b1 b2 b3
2 b4 b5
2 b4 b5
3 b6
って感じになってしまったので、とりあえずdistinctつけて解決しました。
#あ、distinctじゃなくて結合うまいこと
#調整すればいきそうな気もしますが、
#どなたかお分かりになられたら
#ついでに教えてください(^^;
DISTINCTを全く使わないのは無理でしょう。
SELECTのところでDISTINCTを使いたくないのであれば、
SELECT ida, array(略) FROM (SELECT DISTINCT ida FROM x) AS x;
という手もあります。
なるほど、ありがとうございました。
あ、なるほど。
配列と自己結合使えばいいんですね!これは思いつきませんでした。
先ほど試してみたら、
1 b1 b2 b3
1 b1 b2 b3
1 b1 b2 b3
2 b4 b5
2 b4 b5
3 b6
って感じになってしまったので、とりあえずdistinctつけて解決しました。
#あ、distinctじゃなくて結合うまいこと
#調整すればいきそうな気もしますが、
#どなたかお分かりになられたら
#ついでに教えてください(^^;