• ベストアンサー

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が思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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)

回答No.5

動作するの確認しました。 見やすいように行の先頭には全角スペースが入っていますので 取り除いてください。 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 ;

回答No.4

いろいろ解決法はあると思いますよ。 ・分析関数を使ってみる。 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)
回答No.3

な、何度も申し訳ありません。 From句がぬけていますね。 自分で見ててもアホらしいことですが、 なんでここは、自分の投稿した回答を修正したり削除したりできないんですかね。。。 以後注意します。。。。

  • shin_5696
  • ベストアンサー率39% (21/53)
回答No.2

あ、いきなり間違えてました。申し訳ない。。。 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)
回答No.1

最近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

関連するQ&A