- ベストアンサー
2つのテーブル結合
Oracle10g使用しています。 テーブルAとテーブルBを結合させてデータを取得したいと思っています。 [テーブルA] ID name 1 A 2 B 3 C 4 D [テーブルB] ID SEQ VALUE 1 1 111 2 1 222 2 2 333 3 1 444 4 1 555 4 2 666 4 3 777 テーブルAのキーは[ID]、テーブルBのキーは[ID,SEQ]です。 この二つを連結して以下のように出力したいと思っています。 ID SEQ NAME VALUE 1 1 A 111 2 2 B 333 3 1 C 444 4 3 D 777 テーブルBのデータは同じIDのうち最大のSEQのものを取得したいのですが よいSQLが思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
訂正。 select ID, C.SEQ, NAME, C.VALUE from テーブルA, ( select A.ID, A.SEQ, A.VALUE from テーブルB A, ( select max(SEQ) as SEQ, ID from テーブルB group by ID order by ID <-- これ要りません。(あっても動きますが) ) B where A.ID = B.ID and A.SEQ = B.SEQ ) C where ID = C.ID order by ID
その他の回答 (5)
- SpiralGalaxy
- ベストアンサー率39% (649/1653)
動作するの確認しました。 見やすいように行の先頭には全角スペースが入っていますので 取り除いてください。 select ID, C.SEQ, NAME, C.VALUE from テーブルA, ( select A.ID, A.SEQ, A.VALUE from テーブルB A, ( select max(SEQ) as SEQ, ID from テーブルB group by ID order by ID ) B where A.ID = B.ID and A.SEQ = B.SEQ ) C where ID = C.ID order by ID ;
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
いろいろ解決法はあると思いますよ。 ・分析関数を使ってみる。 select b.id,b.seq,a.name,b.value from (select a.*,row_number() over(partition by id order by seq desc) R from a) a, b where a.id=b.id and R=1; ・抽出条件でがんばってみる。 select b.id,b.seq.a.name,b.value from a,b where a.id=b.id and (a.id,a.seq) in (select id,max(seq) from a); ・結合でがんばってみる。 select b.id,b.seq.a.name,b.value from a,b, (select id,max(seq) max_seq from a group by id) x where a.id=b.id and a.id=x.id and a.seq=x.max_seq; 参考までに、3つともテストしてません。(目視検査のみ)
- shin_5696
- ベストアンサー率39% (21/53)
な、何度も申し訳ありません。 From句がぬけていますね。 自分で見ててもアホらしいことですが、 なんでここは、自分の投稿した回答を修正したり削除したりできないんですかね。。。 以後注意します。。。。
- shin_5696
- ベストアンサー率39% (21/53)
あ、いきなり間違えてました。申し訳ない。。。 maxをかけるのはSEQですよね・・・ 正しくは select b.id max(b.seq) a.name b.value where a.id = b.id order by b.id group by b.id でした。
- shin_5696
- ベストアンサー率39% (21/53)
最近SQL打ってないので微妙ですが、以下のSQL文でいけませんか? select max(b.id) b.seq a.name b.value where a.id = b.id order by b.id group by b.id