• 締切済み

oracle sqlで先頭の1件を取得

こんにちはみなさん。 現在、Oracle10gR2を使用しています。 そこで、以下のようなテーブルが存在します。 table_A(明細テーブル) denday | cd | suu | kingaku 2011/03/05 | 1| 1| 1000 2011/03/10 | 1| 2| 2000 table_B(マスタ) cd| henkoday | nm 1 | 2011/03/01| testA 1 | 2011/03/02| testB 1 | 2011/03/06| testC 上記マスタはcd、henkodayで管理しています。 上記table_Aとtable_Bを結合したいと思います。 そこで select t1.* ,t2.* from (select * from table_A order by denday) t1, (select * from table_B order by cd,henkoday desc) t2 where t1.cd=t2.cd and t1.denday>=t2.henkoday とした場合、マスタの3件分、明細データの重複ができてしまいます。 それを、直近の該当マスタのみ参照したいのですが、 以下のようなデータ抽出 table_A(明細テーブル)     table_B(マスタ) denday | cd | suu | kingaku | cd | henkoday | nm 2011/03/05 | 1 | 1 | 1000 | 1 | 2011/03/02 | testB 2011/03/10 | 1 | 2 | 2000 | 1 | 2011/03/03 | testC そのSQLがわかりません。 どうかよろしくお願いします。

みんなの回答

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

こんなかんじでどうでしょうか。 select cd,denday,suu,kingaku,t2cd,henkoday,nm from( select t1.*,t2.cd t2cd,t2.henkoday,t2.nm ,row_number() over(partition by t1.cd,t1.denday order by t2.henkoday desc)rnum from table_A t1 inner join table_b t2 on (t1.cd = t2.cd and t1.denday >= t2.henkoday)) where rnum = 1; とか select t1.*,t2.* from table_A t1 inner join table_b t2 on (t1.cd = t2.cd and t1.denday >= t2.henkoday) where t2.henkoday = ( select max(henkoday) from table_B t3 where t1.cd = t3.cd and t1.denday >= t3.henkoday); です。

関連するQ&A