- ベストアンサー
追加クエリで重複データなしで追加したい
テーブル:T_管理1、T_管理2 フィールド: F1、F2(T_管理1) ID、商品名(T_管理2) となっています。 T_管理1は一時テーブルでレコードをT_管理2に放り込みます。 ただ、放り込む際にIDが重複しては困るのでそのチェック をかけたいと思いますが、どこでかけるといいのでしょうか? VBAでレコードセットをループさせ有無チェックをしてから AddNewをするのであればわかるのですが、できればアクション クエリで解決できればと思っています。 INSERT INTO T_管理2 ( ID, 商品名 ) SELECT F1, F2 FROM T_管理1 WHERE (((F1) Not In (SELECT ID FROM T_管理2))); でどうかと思ったのですが、レコードは1件も抽出されませんでした。 Access2000
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
INSERT INTO T_管理2 (ID,商品名) SELECT T_管理1.F1,T_管理1.F2 FROM T_管理1 LEFT JOIN T_管理2 ON T_管理1.F1 = T_管理2.ID WHERE T_管理2.ID IS NULL SELECT文で差分をとって、結果をインサートするだけ
その他の回答 (2)
- ARC
- ベストアンサー率46% (643/1383)
> WHERE (((F1) Not In (SELECT ID FROM T_管理2))); >を WHERE (((F1) In (SELECT ID FROM T_管理2))); >で、逆にするとヒットするのです。 ということは、矢張りデータなのではないでしょうか? T_管理1 に入力されているデータが全件、既にT_管理2にも入っている、ということになりませんか? もしこの仮説が外れているようであれば、後はデータの破損くらいしか考えられないような気がします。 (データベースの修復とかを試してみると・・・?)
補足
修復しても直らなかったのですが、なぜか、#3さんのクエリをかました後、Not In でも 対象となるレコードが表示されるようになりました。 理由はわかりませんが、とりあえず、OKの状態です。 ありがとうございました。
- ARC
- ベストアンサー率46% (643/1383)
一番楽そうなのは、T_管理2のIDフィールドにインデックス(重複なし)を付けることだと思います。 このようにしておけば、単純にT_管理1の全件をT_管理2に追加する、みたいなやり方でも問題なく、重複しない商品だけを追加してくれると思います。 ちなみに、お書きになったSQL自体は問題ないように思えます。 T_管理1.F1のデータ型とT_管理2.IDのデータ型とが等しいかとか、実際に1件も出てこないようなデータになっていないかどうか、とかをチェックしてみられては如何でしょうか。
補足
> T_管理2のIDフィールドにインデックス(重複なし)を付けること そうかもしれません。 > WHERE (((F1) Not In (SELECT ID FROM T_管理2))); を WHERE (((F1) In (SELECT ID FROM T_管理2))); で、逆にするとヒットするのです。
お礼
ありがとうございました。 おかげで動きました。