- PR -

テーブルの結合とグループ化について

1
投稿者投稿内容
ななな
会議室デビュー日: 2005/03/13
投稿数: 5
投稿日時: 2005-03-13 15:32
SQLのテーブルJOINとグループ化について、どうにも意図した結果に
ならず悩んでいます。どうか、ご存知のかた教えてください。
以下のTBL_A,B,Cにおいて、テーブルの結合をして【結果】を得たい
のですが、TBL_CのNUM列はID、SUB_IDのが同一なものの中で最大値
を求め、その行のC列を結果に加えたいのです。
ちなみにDBMSはDB2です。説明が足りないかも知れませんが、宜しく
お願いいたします。

TBL_A
ID   A
------- -------
1    a
2    b
3    c
4    d

TBL_B
ID   SUB_ID B
------- ------- -------
1    1    aaa
1    2    bbb
2    1    ccc
2    2    ddd
3    1    eee
4    1    fff

TBL_C
ID   SUB_ID NUM   C
------- ------- ------- -------
1    1    1    aaaa
1    1    2    bbbb
1    2    1    cccc
1    2    4    dddd
2    1    4    eeee
2    1    2    ffff
2    2    3    gggg
2    2    2    hhhh
3    1    2    iiii
3    1    4    jjjj
4    1    1    kkkk
4    1    3    llll

【結果】
ID   SUB_ID A    B    NUM   C
------- ------- ------- ------- ------- -------
1    1    a    aaa   2    aaaa
1    2    a    bbb   4    dddd
2    1    b    ccc   4    eeee
2    2    b    ddd   3    gggg
3    1    c    eee   4    jjjj
4    1    d    fff   3    llll

(追記)テーブルのSAMPLEが見づらいので編集しました。


[ メッセージ編集済み 編集者: ななな 編集日時 2005-03-13 15:50 ]
TomScissors
ベテラン
会議室デビュー日: 2003/06/05
投稿数: 79
投稿日時: 2005-03-13 17:00
とりあえず、どのようなSQLを作ってみたのか貼り付けてみてください。
※いちばんそれっぽくなったもので結構です(1つでも)

Cテーブルを、ID、SUB_IDでグループ化してNUMのMAXを取得したものを作成し、普通に結合。
↓このような構造になるかとおもいます(GROUP BYやWHEREは省略しています)
SELECT ...
FROM A,B,C,
(SELECT ID,SUB_ID,MAX(NUM) AS MAX_NUM
FROM C
) AS C_2
ななな
会議室デビュー日: 2005/03/13
投稿数: 5
投稿日時: 2005-03-14 10:47
お返事ありがとうございます。
最初に試みたのは、以下の通りです。

SELECT TBL_A.ID, TBL_B.SUB_ID, Max(TBL_C.NUM) AS NUM, TBL_A.A, TBL_B.B, TBL_C.C
FROM (TBL_A INNER JOIN TBL_B ON TBL_A.ID = TBL_B.ID) INNER JOIN TBL_C ON (TBL_B.SUB_ID = TBL_C.SUB_ID) AND (TBL_A.ID = TBL_C.ID)
GROUP BY TBL_A.ID, TBL_B.SUB_ID, TBL_A.A, TBL_B.B, TBL_C.C;

すると、【結果】は、以下の通りとなってしまいました。

ID    SUB_ID NUM   A    B    C
------- ------- ------- ------- ------- -------
1    1    1    a    aaa   aaaa
1    1    2    a    aaa   bbbb
1    2    1    a    bbb   cccc
1    2    4    a    bbb   dddd
2    1    4    b    ccc   eeee
2    1    2    b    ccc   ffff
2    2    3    b    ddd   gggg
2    2    2    b    ddd   hhhh
3    1    2    c    eee   iiii
3    1    4    c    eee   jjjj
4    1    1    d    fff   kkkk
4    1    3    d    fff   llll

ID、SUB_IDの中で同一のものの中で最大のNUMを求め、その行のCを
もってきたいのですが・・・。

まずは、TomScissorsさんに教えていただいた方法で試してみます。
ななな
会議室デビュー日: 2005/03/13
投稿数: 5
投稿日時: 2005-03-14 10:48
お返事ありがとうございます。
最初に試みたのは、以下の通りです。

SELECT TBL_A.ID, TBL_B.SUB_ID, Max(TBL_C.NUM) AS NUM, TBL_A.A, TBL_B.B, TBL_C.C
FROM (TBL_A INNER JOIN TBL_B ON TBL_A.ID = TBL_B.ID) INNER JOIN TBL_C ON (TBL_B.SUB_ID = TBL_C.SUB_ID) AND (TBL_A.ID = TBL_C.ID)
GROUP BY TBL_A.ID, TBL_B.SUB_ID, TBL_A.A, TBL_B.B, TBL_C.C;

すると、【結果】は、以下の通りとなってしまいました。

ID    SUB_ID NUM   A    B    C
------- ------- ------- ------- ------- -------
1    1    1    a    aaa   aaaa
1    1    2    a    aaa   bbbb
1    2    1    a    bbb   cccc
1    2    4    a    bbb   dddd
2    1    4    b    ccc   eeee
2    1    2    b    ccc   ffff
2    2    3    b    ddd   gggg
2    2    2    b    ddd   hhhh
3    1    2    c    eee   iiii
3    1    4    c    eee   jjjj
4    1    1    d    fff   kkkk
4    1    3    d    fff   llll

ID、SUB_IDの中で同一のものの中で最大のNUMを求め、その行のCを
もってきたいのですが・・・。

まずは、TomScissorsさんに教えていただいた方法で試してみます。
ななな
会議室デビュー日: 2005/03/13
投稿数: 5
投稿日時: 2005-03-14 12:31
なかなかうまくいきません・・・。

まず、TBL_Cの中から、ID、SUB_IDが同一で、NUMがMAXのTBL_C.CのSELECTができません。

ご存知の方、ご教示ください。

[ メッセージ編集済み 編集者: ななな 編集日時 2005-03-14 12:50 ]
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2005-03-14 14:06
今日は。
引用:

まず、TBL_Cの中から、ID、SUB_IDが同一で、NUMがMAXのTBL_C.CのSELECTができません。


by ORACLE(DB2でも同じ関数はあると思いますので、そのままいけるかと。)

SELECT TBL_C.C FROM TBL_C WHERE NUM=(SELECT MAX(NUM) AS MAX_DATA FROM TBL_C WHERE ID=SUB_ID) AND ID=SUB_ID

MAX_DATAの部分は適当な名前を使って下さいな

ななな
会議室デビュー日: 2005/03/13
投稿数: 5
投稿日時: 2005-03-14 14:26
NAOさん、お返事ありがとうございます。

「TBL_Cの中から、ID、SUB_IDが同一で、」という部分ですが、TBL_Cの中でカラムID、SUB_IDが同一の行という意味でした。
説明が足りず申し訳ございません。

何とか、以下の方法で意図した結果になりましたが、
SELECT TBL_A.ID, TBL_B.SUB_ID, TBL_C_3.NUM, TBL_A.A, TBL_B.B, TBL_C_3.C 
FROM (TBL_A INNER JOIN TBL_B ON TBL_A.ID = TBL_B.ID) INNER JOIN (SELECT TBL_C.ID, TBL_C.SUB_ID, TBL_C.NUM, TBL_C.C FROM TBL_C INNER JOIN (SELECT TBL_C.ID, TBL_C.SUB_ID, MAX(TBL_C.NUM) AS NUM FROM TBL_C GROUP BY TBL_C.ID, TBL_C.SUB_ID) AS TBL_C_2 ON (TBL_C.NUM = TBL_C_2.NUM) AND (TBL_C.SUB_ID = TBL_C_2.SUB_ID) AND (TBL_C.ID = TBL_C_2.ID)) AS TBL_C_3 ON (TBL_A.ID = TBL_C_3.ID) AND (TBL_B.SUB_ID = TBL_C_3.SUB_ID);

冗長な感は否めません。もっと簡単な方法はないものでしょうか。
taro
ぬし
会議室デビュー日: 2003/10/20
投稿数: 316
投稿日時: 2005-03-14 21:19
NAOさんとほぼ一緒ですが、こんな感じでしょうか?

SELECT * FROM TBL_A,TBL_B,TBL_C WHERE TBL_C.ID=TBL_A.ID AND TBL_C.SUB_ID=TBL_B.SUB_ID AND TBL_C.NUM=(SELECT MAX(NUM) FROM TBL_C
WHERE ID=TBL_A.ID AND SUB_ID=TBL_B.SUB_ID)
1

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