• ベストアンサー
  • すぐに回答を!

SQL:Access:プライオリティが異なる2つのテーブルのマージ

みなさん、こんばんは。 下記のような TBLmain、TBLsub という2つのテーブルをマージするにあたって、 主キーが同じであるレコードがそれぞれのテーブルに存在する場合には、 TBLmain を優先させ、TBLresult のような結果を得たいのですが、 どのように SQL を記述すればよいのでしょうか? DB は Access2000 を使用しています。 どうぞ、よろしくお願いいたします。 TBLmain 1 aaa 4 bbb 8 ccc TBLsub 1 XXX 2 TTT 3 YYY TBLresult 1 aaa 2 TTT 3 YYY 4 bbb 8 ccc

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数237
  • ありがとう数4

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

  • ベストアンサー
  • 回答No.1

メインの全レコードと、サブとメインの不一致クエリーから求めたサブのレコードをunionで和を求めています。 select f1, f2 from TBLmain union all select s.f2, s.f2 from TBLmain as m right join TBLsub as s on m.f1 = s.f1 where isnull(s.f2); #SQLを回答してもらいたかったらフィールド名くらい書いておきましょうね。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

AS で助かりました。 ありがとうございました。

関連するQ&A

  • AccessSQL 1つのテーブルに複数のデータ

    お世話になっております。 アクセスSQLでの質問です。 --テーブル---------- F_1 F_2 AAA BBB AAA CCC BBB XXX CCC DDD DDD YYY 1.F_1のAAAを条件にF_2のBBB・CCCを取得し、 F_1のBBB・CCCと、F_2のXXXとDDDを取得します。 次に、取得したF_2のXXX・DDDを条件に、F_1のDDD、F_2のYYYを取得します。 つまり、AAAを取得した結果、SQL一つで、上記テーブルデータをF_1:AAA以外、取得したい要件です。 有識者の方、ご享受頂きたいです。 宜しくお願い致します 【自力で考えた結果】 -------------------------- select F_MenuCD,F_ZaiCD from [TABLE] where F_MenuCD IN ( SELECT F_ZaiCD FROM [TABLE] WHERE F_MenuCD IN ('AAA') ); F_1 F_2 BBB XXX CCC DDD を取得するSQLは上記でいけそうなのですが、 DDD YYY を、1つのSQLで取得したいのです。

  • SQL文 テーブル1つに複数のデータ

    お世話になっております。 SQLでの質問です。 --テーブル---------- F_1 F_2 AAA BBB AAA CCC BBB XXX CCC DDD DDD YYY 1.F_1のAAAを条件にF_2のBBB・CCCを取得し、 F_1のBBB・CCCと、F_2のXXXとDDDを取得します。 2.次に、取得したF_2のXXX・DDDを条件に、F_1のDDD、F_2のYYYを取得します。 これを1つのSQLで実行したいのですが、副問合せを駆使しても、良いSQLが思い浮かびません。 有識者の方、ご享受頂きたいです。 宜しくお願い致します。

  • 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文で処理可能なのでしょうか?

その他の回答 (1)

  • 回答No.2

SQL1文で記述するよりは、クエリーを作成して順番に実行するほうがいいと思います。 1.TBLresultテーブルを新規作成する。もちろんデータは空。 2.追加クエリーでTBLmainからTBLresultへ追加する。 3.同様に追加クエリーでTBLsubからTBLresultへ追加する。 4.TBLresultを主キーでソートすればOK

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ひとつの方法ですね。 RDBMSの具体的な実装がわからないので、 なかなか素人には判断できないところです。 ありがとうございました。

関連するQ&A

  • SQLについての質問です

    SQLの質問です。(Oracle) 二つのテーブル T1, T2 に、それぞれ三つのカラム A, B, C があり、A, B の値が同じである行においてT1のCからT2のCへ値をコピーするSQLを教えてほしいです。 以下、そのデータ例です。 テーブル T1 A B C --------- 1 AAA 10 2 BBB 20 3 CCC 30 テーブル T2 A B C --------- 1 AAA 0 2 XXX 0 4 YYY 0 この場合、結果としてテーブル T2は1行目だけがカラム Cの値がT1からコピーされ A B C --------- 1 AAA 10 2 XXX 0 4 YYY 0 としたいです。

  • Accessの表形式のフォームについて

    現在、Access2000で表形式のフォームを作成しています。 一点行き詰まっていることがあるので、どなたか教えて下さい。 いくつか項目がある表形式のフォームがあります。 項目2には日付を入れるのですが、隣にボタンを作り押すことにより 項目2に今日の日付が入るようにします。 そこで質問ですが、項目2に既に日付が入っている場合は、ボタンを 表示させたくないのですが、プロパティの”可視/Visible/”を触ると 表全部(行)に見えたり見えなかったりしていますます。 1行毎に制御することはできないのでしょうか? 詳しい方、どうか教えて下さい。お願い致します。 --こうなってしまう--------------------------- 項目1   項目2        項目3 ・・・ AAA   2009/11/24[ボタン]  XXX BBB           [ボタン]  YYY CCC   2009/11/25[ボタン]  ZZZ --こうしたい--------------------------------- AAA   2009/11/24       XXX BBB           [ボタン]  YYY CCC   2009/11/25       ZZZ

  • SQLについて

    レコード1 |レコード2 |レコード3 AAA |1111 |0000 BBB |1111 |0000 CCC |2222 |2222 CCC |3333 |2222 CCC |4444 |2222 上記のようなテーブルがあった場合、レコード1のAAAとBBBは値をそのまま抽出し レコード1のDDDはレコード2とレコード3の値が一致しているものを抽出したいのですが ひとつのSQLで実現することは可能でしょうか? レコード2とレコード3の値が一致しているものを抽出だけなら簡単にできそうなのですが AAAとBBBもというところで悩んでます。どうかご教授ください。

  • SQLについて

    SQLについてわからないのでご教授ください。 TABLE AAA コード 適用開始日   適用終了日    ------ ----------- ----------- aaa 20100101 99999999 bbb 20100101 20100531 bbb 20100601 99999999 ccc 20100101 20110711 ccc 20110712 99999999 TABLE BBB コード 適用開始日   適用終了日    ------ ----------- ----------- aaa 20100101 99999999 bbb 20100101 20100531 ccc 20100101 20110711 ・テーブルBBBの適用終了日が'99999999'のコードは テーブルAAAでは適用終了日が'99999999'の1レコードのみ。 ・テーブルBBBの適用終了日が'20100531'などの'99999999'以外は テーブルAAAでは適用終了日が'20100531'のレコードと、翌日'20100601'が適用開始日に設定され '99999999'が適用終了日に設定されたレコードの2レコードが存在。 上記2つが正常の状態です。 これらの条件に反する異常を検知するようなSQLを作りたいです。 たとえば、テーブルAAAのレコード[bbb 20100601 99999999]がない場合、 実行結果としてコード「bbb」が出力されるようなSQLが欲しいです。 異常がなければ、「なにも選択されませんでした。」でよいです。 条件として、 ・テーブルAAAでは「コード」「適用開始日」がPK ・テーブルAAAでは同じコードの「適用開始日」「適用終了日」の期間がかぶることはない ・テーブルAAAでは同じコードで3レコード以上は存在しない   (たとえば20100101~20100531、20100601~20100931、20101001~20101231の3つの期間は存在しない) 実行結果はあくまで私の考えで、 異常を検知できればどのような形でも大丈夫です。 なにかあれば補足します。 どうぞよろしくお願い致します。

  • 抜けている番号を抽出したい(Access2003)

    主キーのフィールドには AAA000001 AAA000002 AAA000004 BBB000001 BBB000003 BBB000004 CCC000001 CCC000005 ・ ・ ・ というレコードが多数あるのですが これだけなら AAA000003 BBB000002 CCC000002 CCC000003 CCC000004 がないというのがぱっと見でわかるのですが データが数千レコードあります。 クエリなどで抽出する方法ありますでしょうか? よろしくお願いします。

  • あるテーブルをそっくり別のテーブルに追加

    あるテーブルのレコードをそっくり別のテーブルに追加するSQLを教えていただけないでしょうか。 #フィールド名等はまったく同じです。 windows2000 access2000 です。

  • AccessのSELECT文の結果でナンバリングする方法

    Access2000のクエリで、以下のSQL文を作っています。  SELECT TB.項目1, TB.項目2, TB.項目3  FROM TB  ORDER BY TB.項目1, TB.項目2; テーブルには、以下のデータが登録されています。  項目1 項目2 項目3  ----------------------  あああ 345 CCC  いいい 234 AAA  あああ 123 BBB 現在のクエリ結果表示は以下のようになっています。  項目1 項目2 項目3  ----------------------  あああ 123 BBB  あああ 345 CCC  いいい 234 AAA これを、以下のようにナンバリングをつけて結果表示するSQL文を教えていただけないでしょうか?  No 項目1 項目2 項目3  ----------------------  1 あああ 123 BBB  2 あああ 345 CCC  3 いいい 234 AAA

  • SQL、2つのテーブルで条件一致したものだけdeleteする方法は?

    オラクルSQLで質問です やりたいことは、 テーブルAから以下の条件に該当するデータを削除する。 基本的にはテーブルBの内容と比較して、一致したもの。 条件(全ての条件を満たすこと)  テーブルA.AAA = テーブルB.AAA  テーブルA.BBB = テーブルB.BBB  テーブルB.CCC > 0 調べたところ、SQLサーバでは以下のように from を2つ書いて実現できるようです。 が、今回はオラクルなので文法エラーになります。 delete FROM テーブルA FROM テーブルB where テーブルA.AAA = テーブルB.AAA AND テーブルA.BBB = テーブルB.BBB AND テーブルA.CCC > 0 ; commit; よろしくお願いします

  • Access2002 2つのテーブルのマージ方法

    いつもお世話になっております。 クエリについてお聞きします。 現在、2つのAccessDBが稼動しており、それを1つにまとめる作業をしています。 2つのDBには似通ったテーブルが存在し、それをマージする方法で悩んでいます。 テーブルA ・社員番号 ・社員氏名 ・フリガナ ・会社コード ・部署コード テーブルB ・従業員コード ・従業員名カナ ・従業員名 ・所属コード フィールドの定義としましては、 社員番号=従業員コード 社員氏名=従業員名 フリガナ=従業員名カナ 部署コード=所属コード となります。 全てテキストのレコードです。 これを、テーブルAを正にして、テーブルBのデータをAにマージしたいのです。 要件としましては、 1.テーブルAに存在する社員コードにマッチするレコードはそのまま残す(Bのデータは無視) 2.テーブルAに存在せず、Bに存在するものをAに追加する ということです。 クエリを使って色々試しましたが、どうしてもテーブルAに存在するものもアップデートしてしまい、困っています。 どなたかご教授願えれば幸いです。 よろしくお願いいたします。

  • 同じ構造の2つのテーブルで登録済みかを確認したい

    あるデータベースの中に、テーブルAとテーブルBがあります。 テーブルAにはレコードが600件ほど登録されています。 テーブルBは、テーブルAと同じ構造を持ち、レコードが100件ほど登録されています。 この2つのテーブルについて、次のような動作を行うSQL文が知りたいです。 ---------------------------------------------------- テーブルBの任意のレコードについて、「そのレコードのURLの値」と同じURLの値を持つレコードがテーブルAに登録されてない場合、レコードをAに登録する。 なお実行の際、比較するのはURLの値のみであり、URLが同じなら他の値が異なっても登録しないものとする。 ---------------------------------------------------- たとえば、 テーブルA NAME URL (フィールド名) a aaa.com b bbb.com c ccc.com d ddd.com e eee.com テーブルB NAME URL (フィールド名) d ddd.com y eee.com f fff.com g ggg.com としたとき、そのSQL文を実行すると、 テーブルA NAME URL (フィールド名) a aaa.com b bbb.com c ccc.com d ddd.com e eee.com f fff.com g ggg.com となります。 最初はテーブルBをPHPで読み込み、レコード一つ一つを登録済みかチェックしてテーブルAに登録する、という方法を考えました。 しかし、SQLを使っている以上、もっといい方法があるのではないかと思い、質問させていただきました。 このような動作を行うSQL文をどなたか教えてください。 よろしくお願いします。