50969


お世話になります。

初歩的な質問ですみません。

Access2010を使用しています。  
基本となるAテーブルと、比較するBテーブルのidを見て、AにはあるがBにはない  
レコードのみを抽出するSQLを作成しています。

[code]

    SELECT * FROM A LEFT JOIN B ON A.id = B.id WHERE ISNULL(B.id) = TRUE
    
[/code]

…と、方法自体は間違っておらず、結果も正しいものを取得できてはいるのですが、  
A,B共に件数が六万件以上あり、このクエリひとつで30秒ほど時間がかかって  
しまいます。

もっと高速に動作する方法はないでしょうか？

一つの方法として、一度中間テーブルのCを用意し、

[code]

        ① INSERT INTO C (id) SELECT id FROM A
        ② DELETE * FROM C WHERE EXISTS (Select * From B Where C.id = B.id)
    ③SELECT * FROM A INNER JOIN C ON a.id = C.id
    
[/code]

としてみたところ、若干早くなったような気はしますが、やはり実用的な  
レベルではありませんでした。

良い方法がありましたらご教授ください。

よろしくお願いいたします。


CC BY-SA 4.0
2018-12-06T06:13:50.207
50962
2018-12-11T01:09:26.467
2018-12-08T08:22:50.837
19110
9374
question
sql ms-access
Access SQLで、二つのテーブルを比較し、片方にしかない方のデータのみを取得する方法について


Access SQLの特性が分からないので思いつくSQL文を列挙してみます。どれが速いか比較してみてください。

左結合で一致しなかった行を抽出（27秒）

[code]

    SELECT * FROM A LEFT JOIN B ON A.id = B.id WHERE B.id IS NULL
    
[/code]

Bのid一覧を作成し、そこに含まれていない行を抽出（55秒）

[code]

    SELECT * FROM A WHERE A.id NOT IN (SELECT id FROM B)
    
[/code]

Bにidの一致する行が存在しないAの行を抽出（14秒）

[code]

    SELECT * FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE A.id = B.id)
    
[/code]

コメントよりAccessでの実行時間を参考値として記載しました。


CC BY-SA 4.0
2018-12-06T07:47:31.223
50969
2018-12-11T01:09:26.467
2018-12-11T01:09:26.467
4236
4236
50962
answer