- ベストアンサー
値が存在しない場合の処理について
使用プログラム>>Access2000 上手く説明できないのですが、 テーブルAとBとの比較で、フィールド1とフィールド2がBの同じフィールドと一致したら、Bの合致したデータのField3と一致するテーブルCのデータを取得したいと思っています。 同時に、一致しなくても値を返して欲しいのですが、そのような事は可能でしょうか? 欲しいデータ:テーブルCのフィールド 条件1:テーブルAとBの共通フィールドの一致(AND) 条件2:テーブルBとテーブルCの共通フィールドの一致(条件1のフィールドとは別) 条件3:一致しない場合でも値が欲しい。 よろしくお願いします。
- みんなの回答 (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(空白)で表示したいのでしょうか?
その他の回答 (3)
- DexMachina
- ベストアンサー率73% (1287/1744)
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」をクリックすると、 連結の表示が「-」から「→」に変わります。
お礼
回答ありがとうございます。 こちらこそ、図解付で説明していただいたのに良く読みもせずに慌ててやってしまった結果だったので申し訳ないです。 解りやすい説明ありがとうございます。 早速変更してみたのですが、結果は相変わらずでした。 何か、他に説明不足な点などありますでしょうか? テーブルA,Bでの条件をクリアすると、B,Cでは必ず一致します。乱暴な言い方なんですが、CはBのマスタみたいなものだと思ってください。 (ただ、表示する値が欲しいだけなので…) よろしくお願いします。
- O_cyan
- ベストアンサー率59% (745/1260)
#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;
お礼
回答ありがとうございました。 デザインビューだけでなく、教えていただいたSQLでSQLビューでも確認してみました。 ですが、結果は相変わらずでした。 何か、他に説明不足な点などありますでしょうか? テーブルA,Bでの条件をクリアすると、B,Cでは必ず一致します。乱暴な言い方なんですが、CはBのマスタみたいなものだと思ってください。 (ただ、表示する値が欲しいだけなので…) よろしくお願いします。
- DexMachina
- ベストアンサー率73% (1287/1744)
クエリの作成、ということでよろしいでしょうか。 クエリのデザインビューで、 テーブルA テーブルB テーブルC フィールド1-フィールド1 フィールド2-フィールド2 フィールド3→フィールド3 ・・・といった感じの結合をしてやった上で、テーブルCから必要なフィールド (又は「*」で全て)をドラッグ&ドロップしてやればよいのではないかと思います。 (テーブルCに該当レコードがあるものばそのレコードが表示され、 ない場合はそのフィールドが空欄で表示されます) なお、この方法ですと、フィールド1・フィールド2には 必ず値が入力されている(=Nullではない)必要があります。 (Nullのものは、表示対象から外れることになります)
お礼
回答ありがとうございます。返事が遅くなり申し訳ありません。 早速やってみたのですが、空欄で表示されて欲しい所も値が取得できてしまいました。 クエリ式はこんな感じです。 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で一致しなかった時点で空欄なりの処理をして欲しいのですが・・・うーん。
お礼
回答ありがとうございます。 >条件1のA・BのField1とField2が一致とありますが >A・BのField1とField2が一致していないレコードも取得したいというこなのでしょうか? >どのフィールドをなければNull(空白)で表示したいのでしょうか? 仰るとおりの処理です。 A・BのField1とField2が一致していない場合はB・Cに値を取得しに行くのではなく、Nullで表示して欲しい、という事です。 逆に一致した時だけCの値を取りに行く判定をしてほしいのです。 よろしくお願いします。
補足
長い間お付き合いいただいてありがとうございます。 どうやらSQL云々の話ではなくて、現在テストデータで動かしているのですが、それがどうも間違っていたみたいで…。 各テーブルの仕様も良くわからないまま作ろうとしていたので今回とても勉強になりました。 どうもありがとうございました。