プロが教える店舗&オフィスのセキュリティ対策術

以下の様にSQLで実現したいと思っております。
なお、DBはOracle10Gを利用しております。

親と子テーブルがあり以下の構成となっております。
■親テーブル
 ID,カラムA
 1 ,AA
 2 ,BB
 3 ,CC

■子テーブル
 ID,枝番,カラムB
 1 ,1 ,あああ
 1 ,2 ,いいい
 2 ,1 ,ううう
 2 ,2 ,えええ
 2 ,3 ,おおお
 3 ,2 ,かかか

※IDカラムは親テーブルと子テーブルは1:1です
 子テーブルの枝番カラムはIDに対してN件です。

やりたい事としては、上記の2テーブルより、以下の結果を出力したいです。
 ID,カラムA,カラムB
 1 ,AA ,あああ いいい
 2 ,BB ,ううう えええ おおお
 3 ,CC ,かかか

親テーブルを元にして、
親テーブルに紐づく子テーブルのカラムBを連結して出力
するSQLをご教授いただけますでしょうか

A 回答 (2件)

model句の出番ですな。



SELECT 親テーブル.ID, 親テーブル.カラムA, ConcatT.カラムB
FROM 親テーブル
LEFT OUTER JOIN
(
SELECT ID, SUBSTR(ConcatカラムB, 2) AS カラムB
FROM 子テーブル
MODEL RETURN UPDATED ROWS
PARTITION BY(ID)
DIMENSION BY(Row_Number() OVER(PARTITION BY ID ORDER BY 枝番))
MEASURES(カラムB, CAST(NULL AS VARCHAR2(2)) AS ConcatカラムB)
RULES ITERATE(100) UNTIL (PRESENTV(カラムB[ITERATION_NUMBER + 2], 1, 0) = 0)
(ConcatカラムB[0] = ConcatカラムB[0] || ' ' || カラムB[ITERATION_NUMBER + 1])
) ConcatT
ON 親テーブル.ID=ConcatT.ID
ORDER BY 親テーブル.ID;


枝番100件までの想定だけど、事前に件数数えて動的にループ数変えてもいいかも。

参考URL:http://www.geocities.jp/oraclesqlpuzzle/model-22 …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

芸術的で非常に参考になります。恐れいりました。

また参考URLもありがとうございます。
私も頼ってばかりでは無く勉強します、、

お礼日時:2011/05/25 19:40

知っている限り、不可能です。


Nが有限であれば以下のような方法もとれなくはないですが・・・。

Select ID, カラムA, ( Select カラムB From 子 Where 子.ID=親.ID And 枝番=1 )||( Select カラムB From 子 Where 子.ID=親.ID And 枝番=2 )||( Select カラムB From 子 Where 子.ID=親.ID And 枝番=3 )||…||( Select カラムB From 子 Where 子.ID=親.ID And 枝番=N ) From 親;
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
やはり1つのSQLでは無理なのでしょうか、、
Nは最大値も決まっておらず無限の設計になっています、、
でもご回答頂きました内容も考慮しもう少し悩んでみます
ありがとうございます。

お礼日時:2011/05/25 16:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!