• ベストアンサー

追加クエリで重複データなしで追加したい

テーブル: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

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

  • ベストアンサー
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.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文で差分をとって、結果をインサートするだけ

urourojp
質問者

お礼

ありがとうございました。 おかげで動きました。

その他の回答 (2)

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

> WHERE (((F1) Not In (SELECT ID FROM T_管理2))); >を WHERE (((F1) In (SELECT ID FROM T_管理2))); >で、逆にするとヒットするのです。 ということは、矢張りデータなのではないでしょうか? T_管理1 に入力されているデータが全件、既にT_管理2にも入っている、ということになりませんか? もしこの仮説が外れているようであれば、後はデータの破損くらいしか考えられないような気がします。 (データベースの修復とかを試してみると・・・?)

urourojp
質問者

補足

修復しても直らなかったのですが、なぜか、#3さんのクエリをかました後、Not In でも 対象となるレコードが表示されるようになりました。 理由はわかりませんが、とりあえず、OKの状態です。 ありがとうございました。

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

一番楽そうなのは、T_管理2のIDフィールドにインデックス(重複なし)を付けることだと思います。 このようにしておけば、単純にT_管理1の全件をT_管理2に追加する、みたいなやり方でも問題なく、重複しない商品だけを追加してくれると思います。 ちなみに、お書きになったSQL自体は問題ないように思えます。 T_管理1.F1のデータ型とT_管理2.IDのデータ型とが等しいかとか、実際に1件も出てこないようなデータになっていないかどうか、とかをチェックしてみられては如何でしょうか。

urourojp
質問者

補足

> T_管理2のIDフィールドにインデックス(重複なし)を付けること そうかもしれません。 > WHERE (((F1) Not In (SELECT ID FROM T_管理2))); を WHERE (((F1) In (SELECT ID FROM T_管理2))); で、逆にするとヒットするのです。

関連するQ&A

専門家に質問してみよう