• ベストアンサー

値が存在しない場合の処理について

使用プログラム>>Access2000 上手く説明できないのですが、 テーブルAとBとの比較で、フィールド1とフィールド2がBの同じフィールドと一致したら、Bの合致したデータのField3と一致するテーブルCのデータを取得したいと思っています。 同時に、一致しなくても値を返して欲しいのですが、そのような事は可能でしょうか? 欲しいデータ:テーブルCのフィールド 条件1:テーブルAとBの共通フィールドの一致(AND) 条件2:テーブルBとテーブルCの共通フィールドの一致(条件1のフィールドとは別) 条件3:一致しない場合でも値が欲しい。 よろしくお願いします。

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

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

SELECT C.Field4 FROM A INNER JOIN (B INNER JOIN C ON B.Field3 = C.Field3) ON (A.Field1 = B.Field1) AND (A.Field2 = B.Field2); これはA・BのField1とField2が一致していてB・CのField3が一致しているCのField4を表示するSQLですがこれだとB・CのField3が完全一致しているレコードのみのField4を表示するようになっています。 私が書いた SELECT C.Field4 FROM (A INNER JOIN B ON (A.Field2 = B.Field2) AND (A.Field1 = B.Field1)) LEFT JOIN C ON B.Field3 = c.Field3; はA・BのField1とField2が一致していてB・CのField3が一致しているレコードとBにあってCにないレコードのField4(Cに無いのでNullとなり空白のField4)を表示するようになっています。 このようなことではないのでしょうか? >A,Bでの条件をクリアすると、B,Cでは必ず一致します 条件1のA・BのField1とField2が一致とありますがA・BのField1とField2が一致していないレコードも取得したいというこなのでしょうか? どのフィールドをなければNull(空白)で表示したいのでしょうか?

negoro
質問者

お礼

回答ありがとうございます。 >条件1のA・BのField1とField2が一致とありますが >A・BのField1とField2が一致していないレコードも取得したいというこなのでしょうか? >どのフィールドをなければNull(空白)で表示したいのでしょうか? 仰るとおりの処理です。 A・BのField1とField2が一致していない場合はB・Cに値を取得しに行くのではなく、Nullで表示して欲しい、という事です。 逆に一致した時だけCの値を取りに行く判定をしてほしいのです。 よろしくお願いします。

negoro
質問者

補足

長い間お付き合いいただいてありがとうございます。 どうやらSQL云々の話ではなくて、現在テストデータで動かしているのですが、それがどうも間違っていたみたいで…。 各テーブルの仕様も良くわからないまま作ろうとしていたので今回とても勉強になりました。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

No.1です。 正しいSQL文については、既にNo.2の方からご回答を戴いていますので、 前回説明が不充分だった、クエリのデザインビューでの編集について、 説明します。 negoroさんがNo.1の補足欄で書かれたSQLですと、 クエリのデザインビューでは テーブルA  テーブルB  テーブルC フィールド1-フィールド1 フィールド2-フィールド2         フィールド3-フィールド3 と表示されます。 前回の回答と何が違うかというと、フィールド3の連結方法で、 上では「-」となっているのに対して、No.1の方は「→」になっています。 この連結が、「テーブル3(またはC)」を空欄表示の有無に違いを生じます。 「-」を「→」に変えるには、まずデザインビューでその棒部分にマウスカーソルを合わせ、 右クリックします。 すると、「結合プロパティ(J)」「削除(D)」のメニューが表示されます。 (もし「SQLビュー」「データシートビュー」などが出たら、マウスカーソルを 少しずらしてもう一度同じ操作をしてみて下さい) このメニューで「結合プロパティ」をクリックするとダイアログ画面が開きますので、 ここで「テーブル2の全レコードと・・・」を選んで「OK」をクリックすると、 連結の表示が「-」から「→」に変わります。

negoro
質問者

お礼

回答ありがとうございます。 こちらこそ、図解付で説明していただいたのに良く読みもせずに慌ててやってしまった結果だったので申し訳ないです。 解りやすい説明ありがとうございます。 早速変更してみたのですが、結果は相変わらずでした。 何か、他に説明不足な点などありますでしょうか? テーブルA,Bでの条件をクリアすると、B,Cでは必ず一致します。乱暴な言い方なんですが、CはBのマスタみたいなものだと思ってください。 (ただ、表示する値が欲しいだけなので…) よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.2

#1の方の補足にあるSQLではJOINの仕方が違います。 これではNullのフィールドを表示できません。 下記に変更してみてください。 SELECT C.Field4 FROM (A INNER JOIN B ON (A.Field2 = B.Field2) AND (A.Field1 = B.Field1)) LEFT JOIN C ON B.Field3 = c.Field3;

negoro
質問者

お礼

回答ありがとうございました。 デザインビューだけでなく、教えていただいたSQLでSQLビューでも確認してみました。 ですが、結果は相変わらずでした。 何か、他に説明不足な点などありますでしょうか? テーブルA,Bでの条件をクリアすると、B,Cでは必ず一致します。乱暴な言い方なんですが、CはBのマスタみたいなものだと思ってください。 (ただ、表示する値が欲しいだけなので…) よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

クエリの作成、ということでよろしいでしょうか。 クエリのデザインビューで、 テーブルA  テーブルB  テーブルC フィールド1-フィールド1 フィールド2-フィールド2         フィールド3→フィールド3 ・・・といった感じの結合をしてやった上で、テーブルCから必要なフィールド (又は「*」で全て)をドラッグ&ドロップしてやればよいのではないかと思います。 (テーブルCに該当レコードがあるものばそのレコードが表示され、  ない場合はそのフィールドが空欄で表示されます) なお、この方法ですと、フィールド1・フィールド2には 必ず値が入力されている(=Nullではない)必要があります。 (Nullのものは、表示対象から外れることになります)

negoro
質問者

お礼

回答ありがとうございます。返事が遅くなり申し訳ありません。 早速やってみたのですが、空欄で表示されて欲しい所も値が取得できてしまいました。 クエリ式はこんな感じです。 SELECT C.Field4 FROM A INNER JOIN (B INNER JOIN C ON B.Field3 = C.Field3) ON (A.Field1 = B.Field1) AND (A.Field2 = B.Field2); 条件1で一致しなかった時点で空欄なりの処理をして欲しいのですが・・・うーん。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ACCESSクエリでの結合の仕方

    ACCESS 2003を使用しています。 テーブルA テーブルB テーブルC の3テーブルでクエリを作っています。結合的には・・・ テーブルAのフィールドX⇔テーブルCのフィールドX テーブルBのフィールドX⇔テーブルCのフィールドX です。 これで3テーブルに共通する一致データのみ抽出はできるのですが、 3テーブルに共通する一致データに加えて、テーブルAとテーブルBの不一致データ(テーブルCに対する)も一緒に抽出できるようにしたいのです。 2テーブルだけの結合であれば、結合プロパティを、 テーブルAのフィールドX⇒テーブルCのフィールドX のようにすることで実現できるのですが、3テーブルの結合の場合、どのようにすればよいでしょうか? テーブルAのフィールドX⇒テーブルCのフィールドX テーブルBのフィールドX⇒テーブルCのフィールドX のようにしてみましたが、「あいまいな外部結合が含まれているので、SQLステートメントを実行できません。云々。。。」と警告エラーがでてしまいます。 どなたが、ご教授いただけると助かります。 ご面倒ですが、よろしくお願い致します。

  • ACCESSクエリでの結合の仕方・・・SQL文かも

    ACCESS 2003を使用しています。 テーブルA テーブルB の2テーブルでクエリを作っています。 結合的には・・・ テーブルAのフィールドX ⇔ テーブルBのフィールドY です。 これで2テーブルに共通する一致データのみ抽出はできるのですが、 2テーブルに共通する一致データに加えて、 2テーブルの不一致データも一緒にクエリ表示されるようにしたいのです。 欲しいのは抽出イメージは、以下のような感じのクエリ結果です。 テーブルA:フィールドX|テーブルBのフィールドY a             |(空) (空)           |b c             |c d             |(空) (空)           |e f              |f  g             |(空) h             |h おそらく、SQL文を書く必要があるとは、想像できるのですが・・・ どなたか、ご教授いただけると助かります。 よろしくお願いします。

  • アクセスでの処理

    MS-アクセスです。 テーブルAとテーブルBがあります。 この二つを照合し、合致したものに“☆”という印が付くようになっています。 この照合を週に一度行い、印が付いたものを別のテーブルCに移動させたいのですが、その処理方法が分かりません。 テーブルCにはデータを毎週蓄積していきたいと思っています。 (テーブルAとCは全く同じフィールド形態を使っています) 何か方法はありますか?

  • SQLで複数のテーブルと結合したUPDATE文

    普通のUPDATE文はUPDATEするテーブル名を一つ記入して UPDATE テーブルA SET フィールドA = 値A WHERE テーブルA.フィールドB = 値B みたいな感じですが、私のしたい事はと言うと UPDATE テーブルA,テーブルB,テーブルC SET A.フィールドA = 値A WHERE テーブルA.フィールドA = テーブルB.フィールドB AND テーブルB.フィールドB = テーブルC.フィールドC AND テーブルB.フィールドD = 値D AND テーブルC.フィールドE = 値E という具合に複数のテーブルがUPDATEするテーブルA以外のところで、互いに条件で結ばれており、FROM句でUPDATEしないテーブル名まで宣言しないといけなくなっています。そもそもこういうFROM句を使うUPDATE文は実行可能かも不明です。どなたか解決策お願いいたします。ちなみに開発ソフトはVBAを使っています。

  • 同じデータベース内で値の参照

    あるA,B,Cのテーブルがあり、 Aの主キーはシーケンシャル番号が振られています。 この値を参照し、B,Cのテーブルのフィールドに挿入したいのですが、 私のやり方は (1)まずAをInsertする (2)AでInsertしてできたシーケンシャル番号を取得し、 (3)BをInsertする (4)CをInsertする と少しややこしい方法しか思いつきませんでした。 何かよいアイデアがあれば教えていただけたら、ありがたいです。

  • MySQLのクエリの質問です

    テーブルAにフィールドBとフィールドCがあります。 phpmyadminを使って、フィールドBの値が一致するが、フィールドCの値が不一致のレコードを検索したいと思っています。 このような場合はどのようなクエリを書けばよろしいでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 「指定の値を含む」で二つの条件を設定するには

    アクセスのテーブルのテキストフィルタで 「指定の値を含む」で二つの条件を設定するにはどうすればいいでしょうか? 例えば、 フィールド1で[A]and[B]を含むレコードを抽出する方法を教えてください。 クエリは使いたくないです。

  • 1つのテーブルからのデータ取得

    お世話になります。 Table1にはA,Bのフィールドがあり 例えば A=01のレコードを取得(取得するフィールドはA,B) このレコードを(1)とする。 Table1のうち、Aが(1)のBと一致する レコードを(2)とする。 Table1のうち、Aが(2)のBと一致する レコードを(3)とする。 N番目のBと一致するTable1のAがなくなるまで 上記を繰り返す。 (1),(2),(3)・・・の A,Bの値を取得するためには どういうSQL文を書けばいいでしょうか? 例:ここでA=01を設定する テーブル例と結果 Table1 A: B 01:02 取得 02:04 取得 02:05 取得 03:04 X 04:06 取得 05:10 取得 07:11 X 10:15 取得 以上お教えください。よろしくお願いします。

  • Access Dcount で抽出条件複数の場合

    教えてください。Access2000です。 テーブルAでフィールド1の値が「1」でフィールド2の値が「Cを含む全て」としたいのですがどうしたら良いですか? テキストボックスのコントロールソースに記入します。 DCount("*","[テーブルA],"[テーブルA]![フィールド1]=1 and [テーブル1]![フィールド2]='*C*'") よろしくお願いします。

  • SQL文の処理速度向上策について

    はじめまして 当方、初心者で勉強の身です。ご回答頂けたら幸いです。 3つのテーブルから下記条件の項目を取得したのですが どうにも処理速度が遅く困っております。 副問い合わせなどを使い、速度向上を図りたいのですが 良い案はありませんでしょうか。 <テーブル>テーブル名(項目1,項目2・・・) (1)music(項目1~20)総レコード数1万件 (2)data(項目1~12)総レコード数6万件 (3)inside(項目1~18)総レコード数4万件 3テーブルとも3つの同一項目のKeyで構成されています。 <条件> 今日追加された(1)テーブルのレコードの中で(2)、(3)のテーブル両方ともに存在しないレコードを取得すること。(比較項目は3つのKeyのみ) ちなみに現在のSQLは以下の用になっています。 select DISTINCT a.1, a.2, a.3 (3つともKey項目です。) from music a, data b, inside c where a.4 = 20091118 (該当レコードは10件程度です。) and a.1 != b.1 and a.1 != c.1 and a.2 != b.2 and a.2 != c.2 and a.3 != b.3 and a.3 != c.3 結果として出力されるレコードは5件程度です。 以上です。よろしくお願い致します。

このQ&Aのポイント
  • 幕末の海防とは、寛政5年に幕府が沿岸諸藩に海防を命じ、各地に「台場」が構築されました。関西の諸藩により築かれた台場は86ヶ所で、そのうち1/3強の37ヶ所が和歌山藩のものでした。
  • 大砲の調達方法は、国産のものと外国からの購入がありました。外国からの購入の場合、自国の船を砲撃する可能性のある大砲を輸出することになりますが、具体的な国や方法については不明です。幕府や諸藩がどの程度の威力の大砲を購入したかは詳細が不明ですが、南北戦争の残り物を押し付けられた可能性もあります。
  • 幕府や諸藩の大砲に関する具体的な知識については不明ですが、幕末の海防は日本国内の沖縄や薩摩などを含む沿岸地域の防衛を目的として構築されたものでした。
回答を見る