アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

よろしくお願いいたします。

A 回答 (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
    • good
    • 0

動作するの確認しました。


見やすいように行の先頭には全角スペースが入っていますので
取り除いてください。

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
;
    • good
    • 0

いろいろ解決法はあると思いますよ。



・分析関数を使ってみる。
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つともテストしてません。(目視検査のみ)
    • good
    • 0

な、何度も申し訳ありません。



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

あ、いきなり間違えてました。

申し訳ない。。。
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

でした。
    • good
    • 0

最近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
    • good
    • 0

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