- PR -

1:Nの関係にあるデータを1列1行内に結合して表示

1
投稿者投稿内容
ゆう
会議室デビュー日: 2006/06/23
投稿数: 6
投稿日時: 2006-06-23 09:38
Oracle10g

自分なりに調べて、過去ログを色々みてみましたが、
わかりませんでした。。。

以下のようなテーブルが存在し、Table_AのKey_Aに対応する
テーブルBのKey_Bがあります。
Tabla_AとTabale_Bは、1:Nの関係で成り立っており、
結合して一行表示を行いたいです。

Table_A

Key_A
-----------
1
2
3
4


Table_B

Key_B Data_B
------------------
1 A1
1 A2
1 A3
2 A4
2 A5
3 A6


表示したい結果
------------------
1 A1,A2,A3
2 A4,A5
3 A6

Table_B.Data_Bは一行で表示し、複数行ある場合はカンマ区切りとしたい。

よろしくお願い致します。
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2006-06-23 09:48
無理じゃないですかね。

過去ログに、そういう事をする関数を作るって話題があったと思いますが。

(私自身、あまり理解してないので薦めるのもナンですが、関係演算について調べてみるとRDBで出来る事と出来ない事がイメージしやすくなるんじゃないかな?)
むら
会議室デビュー日: 2006/04/11
投稿数: 11
お住まい・勤務地: さっぽろ
投稿日時: 2006-06-23 11:16
まったく参考にならないとは思いますが
SQL Server2000で試しにやってみました。


--ユーザ定義関数 ここから
CREATE FUNCTION dbo.FncTest(@param varchar(2))
RETURNS char(8) AS
BEGIN

DECLARE @Key_B varchar(2)
DECLARE @Data_B varchar(50)

DECLARE crTable cursor for
SELECT
Key_B
,Data_B
FROM
Table_B AS B
WHERE
Key_B = @param


--カーソルオープン
OPEN crTable


DECLARE @text varchar(100)
SET @text = ''
--フェッチ
FETCH NEXT FROM crTable INTO @Key_B
,@Data_B

WHILE @@fetch_status = 0 BEGIN

SET @text = @text + @Data_B + ','

--次をフェッチ
FETCH NEXT FROM crTable INTO @Key_B
,@Data_B
--エラー処理
IF @@error <> 0 BEGIN
BREAK
END

END

--カーソルクローズ
CLOSE crTable
DEALLOCATE crTable

IF LEN(@text) > 0
BEGIN
SET @text = LEFT(@text,LEN(@text)-1)
END
ELSE
BEGIN
SET @text = NULL
END
RETURN @text

END

--ユーザ定義関数 ここまで


--実行するSQL
SELECT
dbo.FncTest(A.Key_A) AS Data
FROM
Table_A AS A
WHERE
dbo.FncTest(A.Key_A) IS NOT NULL

#顔文字を使わないよう編集


[ メッセージ編集済み 編集者: むら 編集日時 2006-06-23 11:17 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2006-06-23 11:37
「表示」っていうのはどこに表示するものでしょうか。なんらかのアプリケーションで
あれば、アプリケーション側で対応すべきです。
むら
会議室デビュー日: 2006/04/11
投稿数: 11
お住まい・勤務地: さっぽろ
投稿日時: 2006-06-23 11:45
引用:

ukさんの書き込み (2006-06-23 11:37) より:
「表示」っていうのはどこに表示するものでしょうか。なんらかのアプリケーションで
あれば、アプリケーション側で対応すべきです。



確かに通常であればそうですね。
でも、できるだけクエリで吸収することが求められる場合もありますね
「求められること自体に問題が多い」ことが多そうですが・・・
ゆう
会議室デビュー日: 2006/06/23
投稿数: 6
投稿日時: 2006-06-23 12:53
アプリで対応させるのが一番早いんでしょうかね。。。
もう少し自分でも検討してみます。
1

スキルアップ/キャリアアップ(JOB@IT)