プロが教えるわが家の防犯対策術!

こんにちはみなさん。
現在、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がわかりません。
どうかよろしくお願いします。

A 回答 (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);

です。
    • good
    • 0

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

関連するカテゴリからQ&Aを探す