• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2つのテーブ2つのフィールド一致レコード抽出)

2つのテーブルから一致するレコード抽出方法のアドバイスをお願いします

このQ&Aのポイント
  • 2つのテーブルから特定のフィールドが一致するレコードを抽出する方法についてアドバイスをいただきたいです。
  • 複数のマッチングデータテーブルとマッチング引抜テーブルがあり、特定のフィールドが一致するレコードのみ抽出したいです。
  • 現在はLEFT JOINを使用して一致しないデータを抽出していますが、一致するデータのみ抽出する方法について教えてください。

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

  • ベストアンサー
noname#245936
noname#245936
回答No.5

Left Outer JoinでIS Not NULLにするといいかと思います。 列名とテーブル名が判りづらいのでややこしいです・・・

yairi1106
質問者

お礼

下記のようにLEFT JOINにして ユニークキーをのフィールド4を外したら 希望通りの9件が抽出されました。 色々とアドバイス ありがとうございました。 SELECT 複数マッチングデータ.* FROM 複数マッチングデータ LEFT JOIN 複数マッチング引抜 ON (複数マッチングデータ.[フィールド2] = 複数マッチング引抜.[フィールド2]) AND (複数マッチングデータ.[フィールド3] = 複数マッチング引抜.[フィールド3]) WHERE (((複数マッチング引抜.[フィールド1]) Is not Null));

yairi1106
質問者

補足

助かりました。 ややこしくて申し訳ございません。 最後のご質問になるかと思いますが SELECT 複数マッチングデータ.* FROM 複数マッチングデータ LEFT OUTER JOIN 複数マッチング引抜 ON (複数マッチングデータ.[フィールド4] = 複数マッチング引抜.[フィールド4]) AND (複数マッチングデータ.[フィールド3] = 複数マッチング引抜.[フィールド3]) AND (複数マッチングデータ.[フィールド2] = 複数マッチング引抜.[フィールド2]) WHERE (((複数マッチング引抜.[フィールド2]) Is not Null)) AND (((複数マッチング引抜.[フィールド3]) Is not Null)) AND (((複数マッチング引抜.[フィールド4]) Is not Null)); で実行すると 結果は同じ1件になるのですが 書きかたに問題ありますでしょうか。

その他の回答 (5)

noname#245936
noname#245936
回答No.6

JOINは集合の考え方ですので以下ご参照ください。 https://doruby.jp/users/kodama/entries/joinをベン図で解説

noname#245936
noname#245936
回答No.4

続きです。 ユニークキーのないデータベースというのは設計的にはNGで、何か一行に絞れる列を基本は作ります。 キーフィールドが無いと検索も遅くなります。 キーフィールドは複数列でもかまいませんが単一列が扱いやすいです。

yairi1106
質問者

補足

アドバイスありがとうございます。 データを少し変えて 複数マッチングデータテーブル [フィールド1][フィールド2][フィールド3][フィールド4][フィールド5]   7      1      7    1 67890   7      1      7    2 67890   7      1      7    3 67890   7      1      7  4 67890   7      1      7   5 67890    7      1      7 6 67890 7      1      7   7 67890    7      3      5  8 67890   7      3      5  9 67890     7      3      7  10 67890   複数マッチング引抜テーブル [フィールド1][フィールド2][フィールド3][フィールド4]   7      1      7    1   7      3      5    2   7      3      1    3    上記のデータがあるとして SELECT 複数マッチングデータ.* FROM 複数マッチングデータ INNER JOIN 複数マッチング引抜 ON (複数マッチングデータ.[フィールド2] = 複数マッチング引抜.[フィールド2]) AND (複数マッチングデータ.[フィールド3] = 複数マッチング引抜.[フィールド3]) AND (複数マッチングデータ.[フィールド4] = 複数マッチング引抜.[フィールド4]); とした場合に 本来ならフィールド2・フィールド3に対して、一致しているのは 下記の結果が9件欲しいのですが   クエリ(結果) [フィールド1][フィールド2][フィールド3][フィールド4][フィールド5]   7      1      7    1 67890   7      1      7    2 67890   7      1      7    3 67890   7      1      7  4 67890   7      1      7   5 67890    7      1      7 6 67890 7      1      7   7 67890    7      3      5  8 67890   7      3      5  9 67890  下記のように1件のみの抽出になってしまいます。 [フィールド1][フィールド2][フィールド3][フィールド4][フィールド5]   7      1      7    1 67890 因みに不一致は [フィールド1][フィールド2][フィールド3][フィールド4][フィールド5]    7      3      7  10 67890 のような希望通りの結果が得られました。 原因は分かりますでしょうか。 お手数をおかけします。

noname#245936
noname#245936
回答No.3

すみません、結合列でフィールド3を使っているから再帰結合しています。 バグってました。 SELECT 複数マッチングデータ.* FROM 複数マッチングデータ INNER JOIN 複数マッチング引抜 ON (複数マッチングデータ.[フィールド1] = 複数マッチング引抜.[フィールド1]) AND (複数マッチングデータ.[フィールド2] = 複数マッチング引抜.[フィールド2]) AND (複数マッチングデータ.[フィールド3] = 複数マッチング引抜.[フィールド3]) ORDER BY 複数マッチングデータ.[フィールド1] , 複数マッチングデータ.[フィールド2] , 複数マッチングデータ.[フィールド3]

yairi1106
質問者

お礼

ご提示ありがとうございます。 希望通りの結果になりました。 仮に本データにユニークなデータが 存在しない場合、連番等を付加してから SQLビューで 対応する認識でよろしいでしょうか。

yairi1106
質問者

補足

これから検証してみますが 必ずしも 複数マッチングデータテーブル 複数マッチング引抜テーブル 上記の2つのデータは レコード数フィールド数が同じになるとは 限らないのですが 2つのテーブルに対して ユニークなデータがない 2つのフィールドを指定したいのですが なにかアドバイスいただければ助かります。

noname#245936
noname#245936
回答No.2

すみません、先ほどのコメントでOrder Byが抜けていました。 SELECT句は、Clusterd Index張っても、出力順の保証が基本はないのでOrder By必要です。

yairi1106
質問者

補足

因みに、フィールド1のようなユニークなデータを 指定するとクエリが5件になるのですが・・・ 不一致ができるのに、一致が抽出できないようです。

noname#245936
noname#245936
回答No.1

え・・・。ここまでできているのに・・・惜しい! 普通にINNER JOINでいいかと思います。 SELECT 複数マッチングデータ.* FROM 複数マッチングデータ INNER JOIN 複数マッチング引抜 ON (複数マッチングデータ.[フィールド2] = 複数マッチング引抜.[フィールド2]) AND (複数マッチングデータ.[フィールド3] = 複数マッチング引抜.[フィールド3]) なお、SELECT句の * はやめた方がいいです。 テーブル定義を変えたときに列数が増えてCall元のプログラムがバグって止まってしまいます。

yairi1106
質問者

補足

SELECT句の *と Order Byの件ありがとうございます。 とりあえずアドバイスいただいた件は、あとで考慮するとして 下記のようにSQLビューに記述すると 本来はクエリ(結果)は 5件のはずですが 処理を5回繰り返してしまうようで 30件になるのですが、 この不具合についてなにか分かりますでしょうか? SELECT 複数マッチングデータ.* FROM 複数マッチングデータ INNER JOIN 複数マッチング引抜 ON (複数マッチングデータ.[フィールド2] = 複数マッチング引抜.[フィールド2]) AND (複数マッチングデータ.[フィールド3] = 複数マッチング引抜.[フィールド3])

関連するQ&A