• ベストアンサー

Access、Aテーブルにあって、Bテーブルにない

Access初心者です。 Aテーブルに存在するレコードかつBテーブルに存在しないレコードを抽出したい。 例えば、 Aテーブル 100 300 Bテーブル 100 200 の場合、300のみ抽出したい。 どのようにすれば抽出できますか。 よろしくお願いします。

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

  • ベストアンサー
回答No.2

Microsoft Jet SQL のリファレンス ->概要 ->データ定義言語 ->データ操作言語 -->SELECT ステートメント -->SELECT ...INTO ステートメント ・・・ -->LEFT JOIN、RIGHT JOIN 操作 <-- ここを参照! ・・・ -->SQL サブクエリ <--------------- ここも参照! <A> id___data1 1____100 2____300 <B> id___data1 1____100 2____200 という二つのテーブルを左外部結合で列<data1>で結合します。 この場合、クエリの実行結果は次のようになります。 SELECT A.* FROM A LEFT JOIN B ON A.data1=B.data1 <q1> id__data1 1___100 2___300 このq1にはWHERE節が書かれていません。 そこで、次のような条件節を付け加えます。 SELECT A.* FROM A LEFT JOIN B ON A.data1=B.data1 WHERE A.data1=B.data1; <q2> id__data1 1___100 結果的にAに存在し、かつBにもあるという条件を満たすレコードが抽出されます。 <AテーブルにあってBテーブルにない> この場合には、<Bテーブルにない>を条件節に書きます。 SELECT A.* FROM A LEFT JOIN B ON A.data1=B.data1 WHERE B.data1 Is Null; <q3> id__data1 2___300 Access は、SQL文中にAccessの関数などを用いることができます。 そこで、関数を用いても同様の結果を得ることが可能。 SELECT A.id, A.data1 FROM A WHERE (((DCount("data1","B","data1=" & [A].[data1]))=0)); ところで、この条件節はサブクエリという形でも書くことが出来ます。 SELECT A.id, A.data1 FROM A WHERE A.data1 NOT IN (SELECT B.data1 FROM B WHERE B.data1=A.data1); と、3つばかりの方法があります。

ohashim
質問者

お礼

素早く、しかも丁寧に教えて頂いてありがとうございます。 良く分かりました。

その他の回答 (2)

  • m3_maki
  • ベストアンサー率64% (296/460)
回答No.3

クエリのウィザードで 「不一致クエリ」 を作成してください。

回答No.1

accessは使った事が無いのでこれで動くかどうかはわかりませんが、SQLの場合で書きます。 列名をCとした場合下記のようにすれば出来ます。 SELECT C FROM Aテーブル WHERE C NOT IN(SELECT C FROM Bテーブル) ただし、この場合、データが多いと遅くなる場合があります、遅い場合少し面倒ですが下記のようにします。 SELECT A.C FROM Aテーブル A WHERE NOT EXISTS(SELECT 'X' FROM Bテーブル B WHERE A.C=B.C)