性格いい人が優勝

何時も大変お世話になっております。

windows7
ACCESS2007(初心者レベルです)
の環境になります。

ACCESSのシステムを作成しており、こちらでの書き込みを参考にさせて頂いた事により、一つ問題が解決したのですが、新たな問題が発生してしまいましたので、ご質問をさせて頂きます。

解決しましたsql文
SELECT T_○.URL, T_○.日, T_○.時, T_○.マシン名, T_○.ユーザ名, T_○.タイトル, T_○.IPアドレス, T_○.グループ名, T_○.ホストID, T_○.登録日時 INTO T_●1 IN 'D:\LOG\Database1.accdb'
FROM T_○, T_条件 IN 'D:\LOG\Database1.accdb'
WHERE (((T_○.URL) Like Choose([T_条件].[SP],"","*","*") & [T_条件].[FN] & Choose([T_条件].[SP],"*","*","")));
上記により大量にあります条件をテーブルから呼び出して無事に抽出が可能となりました。

そこで今回は逆のパターン(上記の抽出から外れたデータ)を別テーブルに作成したく以下のsql文を作成してみました。

SELECT T_○.URL, T_○.日, T_○.時, T_○.マシン名, T_○.ユーザ名, T_○.タイトル, T_○.IPアドレス, T_○.グループ名, T_○.ホストID, T_○.登録日時 INTO T_除外データ IN 'D:\LOG\Database1.accdb'
FROM T_○, T_条件 IN 'D:\LOG\Database1.accdb'
WHERE (((T_○.URL) Not Like Choose([T_条件].[SP],"","*","*") & [T_条件].[FN] & Choose([T_条件].[SP],"*","*","")));
結果、同じ内容のレコードが100件以上に膨れ上がりデータが莫大な物になってしまいました。

つたない文章とsql文で大変申し訳ございませんが、なぜ同じレコードが何件も出来てしまうのでしょうか?
ご指摘及びアドバイスを頂けますと幸いでございます。

A 回答 (2件)

なんか、その方法は見覚えがありますね。


検証はしっかりやってください。
(注意事項を追加しようとしたら、閉じられてしまったのでそのままなんですけど)

参考にされたのは、以下だったでしょうか?

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 を記述すれば良いです。

※※ この記述で、変更すべき点はわかってもらえたでしょうか


※ 冒頭にも記述しましたが、検証はしっかりやってください。
    • good
    • 0
この回答へのお礼

有難うございます。

貼り付けて頂きましたURLの内容を参考にさせて頂きました。

条件が100件以上あり、基データも最大500万件超える場合があり(現在はテストデータですので件数は少ないですが)PCのソフトを学ぶタイミングを作れなく本を見たりネット検索をしたりして作成しております。
件数が膨大ですので、本来はもっと別な物を使った方が良いのでしょうが、中々社内で思う様に出来ないため難儀しております。
こんなレベルの低い人間ですので、検証すべき事にも気が付きませんでした。

まだ記述頂きました内容での変更は行えておりませんが、今一度見直しながら勉強したいと思っております。

今後も質問させて頂く事があるかと思いますが、宜しくお願い申し上げます。

お礼日時:2013/03/13 14:45

すごく複雑な条件抽出ですね、とても全てを読み切ることは出来ません


あくまで推測です

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 を入れて下さい
    • good
    • 0
この回答へのお礼

アドバイス有難うございます。

初心者であるせいか?(複雑=無駄がある?)なsql文になってしまっているかと思います。

お教え頂きました方法もやってみます。

今後も宜しくお願い申し上げます。

お礼日時:2013/03/14 10:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!