• ベストアンサー

2つのテーブルAとBをマージして新しいテーブルCを作成したいのです。

2つのテーブルAとBをマージして新しいテーブルCを作成したいのです。マージするときは、最新の売上日フィールドをもつレコードを取得します。環境はAccess2000です。どんなSQL文を作成すればいいのでしょうか?  また、テーブルAにしかないレコード、又はテーブルBにしかないレコードは、そのままテーブルCに追加したいです。 ※下記テーブルAとBは、Access内に存在します。テーブルCはAとBのマージ後の結果作成されるテーブルです。 テーブルA 顧客番号   売上日   商品名   備考    1  2000-01-01  ふでばこ   A    2  2000-02-02  鉛筆     A    3  2000-03-03  定規     A    4  2000-04-04  シャーペン  A   99  2000-09-09  パソコン   A テーブルB 顧客番号   売上日   商品名   備考    4  2001-04-04  シャーペン  B    2  2000-02-02  鉛筆     B    3  2001-03-03  定規     B    1  1999-01-01  ふでばこ   B  100  2005-11-11  ワープロ   B テーブルAとBを、最新の売上日の条件でレコードを取得し新しいテーブルCを作成する。 テーブルC 顧客番号   売上日   商品名   備考    1  2000-01-01  ふでばこ   A    2  2000-02-02  鉛筆     A    3  2001-03-03  定規     B    4  2000-04-04  シャーペン  A   99  2000-09-09  パソコン   A  100  2005-11-11  ワープロ   B SQL文で処理可能なのでしょうか?

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

  • ベストアンサー
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.3

サブクエリでネストしても出来ない処理があるのでクエリを分けた方が簡単ですよ。 単純にするなら3つ 'qry1として SELECT テーブルA.顧客番号, テーブルA.売上日, テーブルA.商品名, テーブルA.備考 FROM テーブルA UNION SELECT テーブルB.顧客番号, テーブルB.売上日, テーブルB.商品名, テーブルB.備考 FROM テーブルB; 'qry2として SELECT qry1.顧客番号, Max(qry1.売上日) AS 売上日の最大, qry1.商品名 FROM qry1 GROUP BY qry1.顧客番号, qry1.商品名; 'qry3として 'テーブルCを作成するなら SELECT qry2.顧客番号, qry2.売上日の最大 AS 売上日, qry2.商品名, qry1.備考 INTO テーブルC FROM qry2 INNER JOIN qry1 ON (qry2.売上日の最大 = qry1.売上日) AND (qry2.顧客番号 = qry1.顧客番号) GROUP BY qry2.顧客番号, qry2.売上日の最大, qry2.商品名, qry1.備考; '既存のテーブルCに追加するならこちらで INSERT INTO テーブルC ( 顧客番号, 売上日, 商品名, 備考 ) SELECT qry2.顧客番号, qry2.売上日の最大, qry2.商品名, qry1.備考 FROM qry2 INNER JOIN qry1 ON (qry2.売上日の最大 = qry1.売上日) AND (qry2.顧客番号 = qry1.顧客番号) GROUP BY qry2.顧客番号, qry2.売上日の最大, qry2.商品名, qry1.備考; サブクエリで処理できるところもありますがその辺はご自分でネストしてみてください。

その他の回答 (2)

  • PCFREAK
  • ベストアンサー率51% (417/805)
回答No.2

>UNION句はかなりのヒントになりました。しかし上記をAccessで実行すると。「 1  2010/04/04  シャーペン   A 」の1件のレコードしか取得できませんでした。^^;) すみません言葉足らずでした。 商品名でグループ化する必要があるので、 最新の売上日取得クエリの商品名の列に「集計」という欄がありますが、これを「グループ化」にして下さい。

lokki3
質問者

補足

ありがとうございます。しかし、商品名でグループ化しても、その隣のフィールドの「備考」が最小の値である「MIN(備考)」で処理すると、次のような場合矛盾が生じます。テーブルBから最新売上日のレコードをとる時、顧客番号と売上日はテーブルBからとり、備考は、テーブルAからとるという矛盾です。あくまでも、テーブルBから最新のレコードをとった場合、「備考」フィールドもテーブルBからとりたいのです。ご丁寧にありがとうございます。^^

  • PCFREAK
  • ベストアンサー率51% (417/805)
回答No.1

ユニオンクエリを作成してテーブルAとBを結合し、その結果を基に売上日の最大で取得するクエリにすると良いです。 ユニオンクエリ: SELECT * FROM テーブルA UNION SELECT * FROM テーブルB 最新の売上日取得クエリ: SELECT MIN(顧客番号),MAX(売上日),MIN(商品名),MIN(備考) FROM (上記のユニオンクエリ) この「最新の売上日取得クエリ」を元にするテーブルCのテーブル作成クエリを作れば良いでしょう。

lokki3
質問者

補足

UNION句はかなりのヒントになりました。しかし上記をAccessで実行すると。「 1  2010/04/04  シャーペン   A 」の1件のレコードしか取得できませんでした。^^;)とりあえず色々やってみます。いい方法がありましたら教えてください。ありがとうございます。