• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ACCESSの条件について)

ACCESSの条件について

このQ&Aのポイント
  • ACCESSのシステムを作成している際に、一つの問題が解決したが新たな問題が発生しました。
  • 解決した問題により、大量の条件をテーブルから抽出することが可能となりました。
  • しかし、逆のパターンのデータを作成しようとした際に同じ内容のレコードが100件以上になってしまいました。なぜ同じレコードが複数作成されるのかについてご指摘とアドバイスを頂きたいです。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

なんか、その方法は見覚えがありますね。 検証はしっかりやってください。 (注意事項を追加しようとしたら、閉じられてしまったのでそのままなんですけど) 参考にされたのは、以下だったでしょうか? ACCESS クエリ 抽出条件が多い場合 http://oshiete1.goo.ne.jp/qa4719476.html なぜ、上記に追加しようとしたのかを例示してみます。 例えば、「T_条件」が以下の内容になっているとします。 FS FN 2  A 2  B で、Like で見る URL の内容が URL ACE DEF の2レコードだとすると、直積では URL FS FN ACE 2  A → ACE Like '*A*' で、抽出 ACE 2  B → ACE Like '*B*' で、抽出外 DEF 2  A → DEF Like '*A*' で、抽出外 DEF 2  B → DEF Like '*B*' で、抽出外 何を追加しようとしていたのか・・・・は、もしここで、 FS FN 2  A 2  C だったら URL FS FN ACE 2  A → ACE Like '*A*' で、抽出 ACE 2  C → ACE Like '*C*' で、抽出 DEF 2  A → DEF Like '*A*' で、抽出外 DEF 2  C → DEF Like '*C*' で、抽出外 となって、ACE は2レコードとして抽出されることになります。 1レコードにするためには、 GROUP BY URL とか、DISTINCT URL 等で重複を削除する必要があります。 または、あの回答記述を SELECT T1.FN FROM T1 WHERE EXISTS (SELECT 1 FROM TS WHERE T1.FN Like Choose(SP,"","*","*") & FN & Choose(SP,"*","*","")); に変更すべきと思います。なので、上記の逆は・・・・というと SELECT T1.FN FROM T1 WHERE NOT EXISTS (SELECT 1 FROM TS WHERE T1.FN Like Choose(SP,"","*","*") & FN & Choose(SP,"*","*","")); の様に EXISTS の前に NOT を記述すれば良いです。 ※※ この記述で、変更すべき点はわかってもらえたでしょうか ※ 冒頭にも記述しましたが、検証はしっかりやってください。

noname#178200
質問者

お礼

有難うございます。 貼り付けて頂きましたURLの内容を参考にさせて頂きました。 条件が100件以上あり、基データも最大500万件超える場合があり(現在はテストデータですので件数は少ないですが)PCのソフトを学ぶタイミングを作れなく本を見たりネット検索をしたりして作成しております。 件数が膨大ですので、本来はもっと別な物を使った方が良いのでしょうが、中々社内で思う様に出来ないため難儀しております。 こんなレベルの低い人間ですので、検証すべき事にも気が付きませんでした。 まだ記述頂きました内容での変更は行えておりませんが、今一度見直しながら勉強したいと思っております。 今後も質問させて頂く事があるかと思いますが、宜しくお願い申し上げます。

その他の回答 (1)

  • chayamati
  • ベストアンサー率41% (260/624)
回答No.2

すごく複雑な条件抽出ですね、とても全てを読み切ることは出来ません あくまで推測です FROM T_○, T_条件 IN 'D:\LOG\Database1.accdb' WHERE (((T_○.URL) Not Like Choose([T_条件].[SP],"","*","*") & [T_条件].[FN] & Choose([T_条件].[SP],"*","*",""))); ------------------------------------------------------ FROM T_○, T_条件は2つのテーブルですね これでwhere以下がなければ selectされるレコード数はそれぞれのレコード数の積になります 一方が期待通りで、一方が重複なのは Like Choose と Not Like Chooseのためです この重複を避けるには乱暴ですがT_除外データテーブル のどれかのフィールドを重複なしに設定します。 ※ このまま実行すると重複の警告が頻繁に出ます select文の前後に DoCmd.SetWarnings False と DoCmd.SetWarnings true を入れて下さい

noname#178200
質問者

お礼

アドバイス有難うございます。 初心者であるせいか?(複雑=無駄がある?)なsql文になってしまっているかと思います。 お教え頂きました方法もやってみます。 今後も宜しくお願い申し上げます。

関連するQ&A