アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (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文で差分をとって、結果をインサートするだけ
    • good
    • 2
この回答へのお礼

ありがとうございました。

おかげで動きました。

お礼日時:2004/09/23 11:51

> 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の状態です。

ありがとうございました。

補足日時:2004/09/23 11:51
    • good
    • 0

一番楽そうなのは、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)));

で、逆にするとヒットするのです。

補足日時:2004/09/20 12:51
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A