• ベストアンサー

複数条件で抽出したいのですが上手くいきません

テーブルAには「注文番号」「注文者」「金額」「発注日」「出荷日」があります。(約20000件) テーブルBには「金額」「出荷日」があります。(約500件) これら2つのテーブルから、「金額」と「出荷日」が一致するものを抽出したいのですが、 選択クエリで「金額」と「出荷日」を繋いで実行しても抽出できません。 それぞれを別に実行するとできます。ただ、「金額」も「出荷日」も同じ金額と出荷日が多数あるため、500件を遥かに越えた数字になってしまいます。 (6000件とか) それが問題でしょうか? お手数ですが、回答頂ければと思います。

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

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

>テーブルBと上記不一致のリストを比較し金額は一致かつ出荷日も一致もしくは日付が近いレコードを抽出したい 日付が近いというのはあいまいですね。これは金額・出荷日が一致するレコードの修正が終わった後やるしかないと思います。 簡単にやるにはまずテーブルAの選択クエリを作りテーブル追加でテーブルBを追加し金額と出荷日をドラッグし結合します。この状態で金額と出荷日が一致するレコードを抽出するクエリが出来ます。 そのクエリを元に注文番号の不一致クエリを作ります。 これで出来ます。 例えば金額と出荷日が一致するレコードを抽出するクエリを作りクエリ1とすると不一致クエリは SELECT [クエリ1].注文番号, [クエリ1].金額, [クエリ1].出荷日 FROM [クエリ1] LEFT JOIN テーブルB ON [クエリ1].注文番号 = [テーブルB].注文番号 WHERE ((([テーブルB].注文番号) Is Null)); となります。 これで金額・出荷日が一致していて注文番号が一致していないレコードを抽出できます。

kumafukuro
質問者

お礼

抽出できました。ありがとうごさいます。 あとは注文番号を目視で修正していきます。 お忙しいところ色々とありがとうごさいました。

その他の回答 (4)

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

>2つのテーブルから、「金額」と「出荷日」が一致するものを抽出したい >ただ、「金額」も「出荷日」も同じ金額と出荷日が多数あるため500件を遥かに越えた数字 注文番号(重複なしとすれば)が一致するものを抽出すれば当然500件以下で金額と出荷日で抽出をすれば「金額」も「出荷日」も同じ金額と出荷日が多数あればその全てのレコードをテーブルAから抽出するので500件を超えてもおかしくはない。 テーブルA         テーブルB 注文番号 金額 出荷日  注文番号 金額 出荷日 1    \1000 06/04/01   1 \1000 06/04/01 2    \1000 06/04/01 3    \1000 06/04/01 この場合、注文番号が一致するのは1件、金額・出荷日が一致すするのは3件なので抽出をすれば3件とも抽出されてしまうのでテーブルBの1レコードに対してテーブルAの3レコードが該当してしまうのでテーブルBのレコード数より多くなります。 WHERE条件で言えば WHERE ((([テーブルA].注文番号)=[テーブルB]![注文番号]) AND (([テーブルA].金額)=[テーブルB]![金額]) AND (([テーブルA].出荷日)=[テーブルB]![出荷日])) OR ((([テーブルA].注文番号)<>[テーブルB]![注文番号]) AND (([テーブルA].金額)=[テーブルB]![金額]) AND (([テーブルA].出荷日)=[テーブルB]![出荷日])); の状態です 他の方が正規化云々とありますがそれより >「注文番号」で一致すれば一番いいのですが、番号が間違っている可能性があるため これが一番の問題。キーとして役に立っていない。テーブルAとテーブルBの注文番号の整合性が取られていないのでご希望の抽出ができない。 #1の方の言うようにテーブルBにもっと一意として使えるフィールドがないと正確な抽出は出来ません。 注文番号・金額・出荷日が一致しないレコードを抽出してそのレコードの注文番号を修正するようにしテーブルAとテーブルBの注文番号を一意のキーとして使えるようにするしかないと思うのですが。

kumafukuro
質問者

補足

回答ありがとうございます。 皆様の仰るとおり、「注文番号」の一致しないレコードを抽出しテーブルBの「注文番号」を修正したいです。 そのために、テーブルBと上記不一致のリストを比較し、「金額」は一致、かつ「出荷日」も一致、もしくは日付が近いレコードを抽出したいのですが、そのようなことはできるのでしょうか?

noname#60992
noname#60992
回答No.3

そのようなことをするためには、ADOなどを使用する必要がありますが (1) 注文番号が一致しないもののリストを作り、仮テーブルに保存する。 (2) 仮テーブルのレコードを一件ずつテーブルAと照合させ該当レコードを見つけ出し、テーブルBの注文番号を修正する。 (3) 仮テーブルを削除する。 のような手順を踏まれたらいかがでしょうか?

  • crazy_dog
  • ベストアンサー率37% (148/391)
回答No.2

こんにちは No.1さんがおっしゃるとおり、このテーブルBは一体何の意味があるテーブルなんでしょうか? 注文番号一つに商品が一つという関係であるなら、テーブルBは全く意味がありません。 データベースでは、「テーブルの正規化」といわれるテーブルの分割を行ないますが、意味のないところで分けてしまっては、データ自体のつながりがなくなってしまいます。 データのつながり自体をよく考えて「テーブルの正規化」を行なってください。 よろしければ、参考URLをご覧になられてはいかがですか?

参考URL:
http://www.mahoutsukaino.com/
kumafukuro
質問者

補足

皆様にはお忙しいところご回答頂き感謝しております。説明不足で大変申し訳ありません。 テーブルBには「注文番号」、「注文コード」 などもあります。業者から出荷データとしてもらいます。 作業としては (1)「注文番号」で一致させる。 (2)一致しなかったものを「金額」と「出荷日」で一致させる。 上記(2)の作業が上手くいかないため、(1)の記述を省きました。 「注文番号」で一致すれば一番いいのですが、番号が間違っている可能性があるため、次の条件が(2)になるので、それで検索をしたいのです。 選択クエリでのやり方が間違っていないのであれば、両方に一致するデータがないだけなのかもしれません。 操作が間違っているのか、データがないのか判断ができなかったので、操作方法をお伺いしたく質問した次第です。

noname#60992
noname#60992
回答No.1

テーブルBは何のデータを入れるためにあるのですか? 金額も、出荷日もテーブルAに入っていますよね。 テーブルBにもう少し、レコードを限定させる条件(注文者、注文番号)が必要と思います。 どういうデータの保存の仕方を行っていて、何を抽出したいかがはっきりと理解できれば的確なアドバイスも集まると思います。 

関連するQ&A