- ベストアンサー
2つのテーブルから一致するレコード抽出方法のアドバイスをお願いします
- 2つのテーブルから特定のフィールドが一致するレコードを抽出する方法についてアドバイスをいただきたいです。
- 複数のマッチングデータテーブルとマッチング引抜テーブルがあり、特定のフィールドが一致するレコードのみ抽出したいです。
- 現在はLEFT JOINを使用して一致しないデータを抽出していますが、一致するデータのみ抽出する方法について教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
Left Outer JoinでIS Not NULLにするといいかと思います。 列名とテーブル名が判りづらいのでややこしいです・・・
その他の回答 (5)
JOINは集合の考え方ですので以下ご参照ください。 https://doruby.jp/users/kodama/entries/joinをベン図で解説
続きです。 ユニークキーのないデータベースというのは設計的にはNGで、何か一行に絞れる列を基本は作ります。 キーフィールドが無いと検索も遅くなります。 キーフィールドは複数列でもかまいませんが単一列が扱いやすいです。
補足
アドバイスありがとうございます。 データを少し変えて 複数マッチングデータテーブル [フィールド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 のような希望通りの結果が得られました。 原因は分かりますでしょうか。 お手数をおかけします。
すみません、結合列でフィールド3を使っているから再帰結合しています。 バグってました。 SELECT 複数マッチングデータ.* FROM 複数マッチングデータ INNER JOIN 複数マッチング引抜 ON (複数マッチングデータ.[フィールド1] = 複数マッチング引抜.[フィールド1]) AND (複数マッチングデータ.[フィールド2] = 複数マッチング引抜.[フィールド2]) AND (複数マッチングデータ.[フィールド3] = 複数マッチング引抜.[フィールド3]) ORDER BY 複数マッチングデータ.[フィールド1] , 複数マッチングデータ.[フィールド2] , 複数マッチングデータ.[フィールド3]
お礼
ご提示ありがとうございます。 希望通りの結果になりました。 仮に本データにユニークなデータが 存在しない場合、連番等を付加してから SQLビューで 対応する認識でよろしいでしょうか。
補足
これから検証してみますが 必ずしも 複数マッチングデータテーブル 複数マッチング引抜テーブル 上記の2つのデータは レコード数フィールド数が同じになるとは 限らないのですが 2つのテーブルに対して ユニークなデータがない 2つのフィールドを指定したいのですが なにかアドバイスいただければ助かります。
すみません、先ほどのコメントでOrder Byが抜けていました。 SELECT句は、Clusterd Index張っても、出力順の保証が基本はないのでOrder By必要です。
補足
因みに、フィールド1のようなユニークなデータを 指定するとクエリが5件になるのですが・・・ 不一致ができるのに、一致が抽出できないようです。
え・・・。ここまでできているのに・・・惜しい! 普通にINNER JOINでいいかと思います。 SELECT 複数マッチングデータ.* FROM 複数マッチングデータ INNER JOIN 複数マッチング引抜 ON (複数マッチングデータ.[フィールド2] = 複数マッチング引抜.[フィールド2]) AND (複数マッチングデータ.[フィールド3] = 複数マッチング引抜.[フィールド3]) なお、SELECT句の * はやめた方がいいです。 テーブル定義を変えたときに列数が増えてCall元のプログラムがバグって止まってしまいます。
補足
SELECT句の *と Order Byの件ありがとうございます。 とりあえずアドバイスいただいた件は、あとで考慮するとして 下記のようにSQLビューに記述すると 本来はクエリ(結果)は 5件のはずですが 処理を5回繰り返してしまうようで 30件になるのですが、 この不具合についてなにか分かりますでしょうか? SELECT 複数マッチングデータ.* FROM 複数マッチングデータ INNER JOIN 複数マッチング引抜 ON (複数マッチングデータ.[フィールド2] = 複数マッチング引抜.[フィールド2]) AND (複数マッチングデータ.[フィールド3] = 複数マッチング引抜.[フィールド3])
お礼
下記のようにLEFT JOINにして ユニークキーをのフィールド4を外したら 希望通りの9件が抽出されました。 色々とアドバイス ありがとうございました。 SELECT 複数マッチングデータ.* FROM 複数マッチングデータ LEFT JOIN 複数マッチング引抜 ON (複数マッチングデータ.[フィールド2] = 複数マッチング引抜.[フィールド2]) AND (複数マッチングデータ.[フィールド3] = 複数マッチング引抜.[フィールド3]) WHERE (((複数マッチング引抜.[フィールド1]) Is not Null));
補足
助かりました。 ややこしくて申し訳ございません。 最後のご質問になるかと思いますが 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件になるのですが 書きかたに問題ありますでしょうか。