- ベストアンサー
親子関係を持つテーブルから子テーブルの最新レコードを取得する方法について
親子関係を持つ2つのテーブルから データを取得する方法について質問があります。 下記の2つのテーブルがあったとします。 契約基本(A) 【契約番号】【契約名】 K0001 契約名1 K0002 契約名2 K0003 契約名3 契約明細(B) 【契約番号】【契約種別】 【金額】【契約年月日】 K0001 S1 1000 2005/12/01 K0001 S2 2000 2005/12/02 K0001 S3 3000 2005/12/03 K0002 S1 4000 2005/12/23 K0002 S2 5000 2005/12/22 K0002 S3 6000 2005/12/21 K0003 S1 7000 2005/12/10 K0003 S2 8000 2005/12/12 K0003 S3 9000 2005/12/11 この2つのテーブルを結合して、 契約基本・契約番号毎に最も契約明細・契約年月日が 新しいレコードを取得して下記のような 取得結果を得たいと思っています。 A.K0001,A.契約名1,B.K0001,B.S3,B.3000,B.2005/12/03 A.K0002,A.契約名2,B.K0002,B.S1,B.4000,B.2005/12/23 A.K0003,A.契約名3,B.K0003,B.S2,B.8000,B.2005/12/12 これを1本のSQLで実現する場合、 どのような方法が良いのでしょうか? データベースはOracle9iを使用しています。 恐らく既出の質問だとは思いますが どのようなキーワードで検索して良いのかわからず 質問させてもらいました。 お手数をおかけしますが よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
select * from 契約基本 join 契約明細 as T1 on 契約基本.契約番号=T1.契約番号 where exists (select * from 契約明細 group by 契約番号 having T1.契約番号=契約番号 and T1.契約年月日=max(契約年月日) ) 明細の主キーが不明なため スキーマとデータの状態で同じ契約番号の レコードが複数出ることがあります
その他の回答 (2)
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
分析関数を使うと.. select * from 契約基本 A, (select B.*,row_number() over(partition by 契約番号 order by 契約年月日 desc) R from 契約明細 B) X where A.契約番号=X.契約番号 and R=1 な感じで書けます。
- chukenkenkou
- ベストアンサー率43% (833/1926)
Oracleの環境が無いため、MySQLでテストしました。 SQL標準規格の範囲なので、たぶんOracleでも大丈夫 だと思います。 簡単化するため、表名、列名は、英字で表しました。 SELECT A.*,B.* FROM KIHON AS A,MEISAI AS B WHERE (B.KEI_NO,B.KEI_DATE) IN (SELECT KEI_NO,MAX(KEI_DATE) FROM MEISAI GROUP BY KEI_NO) AND A.KEI_NO=B.KEI_NO