• ベストアンサー

親子関係を持つテーブルから子テーブルの最新レコードを取得する方法について

親子関係を持つ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を使用しています。 恐らく既出の質問だとは思いますが どのようなキーワードで検索して良いのかわからず 質問させてもらいました。 お手数をおかけしますが よろしくお願いします。

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

  • ベストアンサー
  • 7marine
  • ベストアンサー率36% (59/160)
回答No.2

select * from 契約基本 join 契約明細 as T1 on 契約基本.契約番号=T1.契約番号 where exists (select * from 契約明細 group by 契約番号 having T1.契約番号=契約番号 and T1.契約年月日=max(契約年月日) ) 明細の主キーが不明なため スキーマとデータの状態で同じ契約番号の レコードが複数出ることがあります

その他の回答 (2)

回答No.3

分析関数を使うと.. select * from 契約基本 A, (select B.*,row_number() over(partition by 契約番号 order by 契約年月日 desc) R from 契約明細 B) X where A.契約番号=X.契約番号 and R=1 な感じで書けます。

回答No.1

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

関連するQ&A