web-dev-qa-db-ja.com

MS Accessで「等しくない」を正しく使用するにはどうすればよいですか?

目的:

このクエリの目的は、別のテーブルの類似した列に存在しない、1つの列のすべての個別の値を選択することです。

現在のクエリ:

SELECT DISTINCT Table1.Column1
FROM Table2, Table1
WHERE Table1.Column1 <> Table2.Column1 

クエリからの結果:

このクエリを実行しようとすると、プログレスバーがすぐにいっぱいになりますが、かなりフリーズし、私の見る限り他には何もしません。 <>の代わりに=記号を使用すると、等しい値が正常に出力され、Table2.Column1を実際の実際の値に置き換えると、正常に機能します。

この質問を入力しているときにもう一度実行したところ、上記のクエリで回答が得られましたが、列のDISTINCT値がすべて含まれているわけではありません。

私が間違っていることやここで見逃していることについてのアイデアはありますか?

10
Bryan

このような

SELECT DISTINCT Table1.Column1
FROM Table1
WHERE NOT EXISTS( SELECT * FROM Table2
    WHERE Table1.Column1 = Table2.Column1  )

「等しくない」ではなく、存在しない


ちなみに、このようなFROM句を書くことはめったにありません:

FROM Table1, Table2

これは、「FROM all Table1のすべての行とTable2のすべての行の組み合わせ...」を意味するため、通常、これは見たい結果よりもはるかに多くの結果行です。そして、本当にそうしたいというまれなケースでは、より受け入れられる構文は次のとおりです。

FROM Table1 CROSS JOIN Table2
17
RBarryYoung

Accessでは、テーブルが非常に小さい場合を除いて、Joinの方が高速であることがわかります。

SELECT DISTINCT Table1.Column1
FROM Table1 
LEFT JOIN Table2
ON Table1.Column1 = Table2.Column1  
WHERE Table2.Column1 Is Null

これにより、Table2で一致するすべてのレコードがリストから除外されます。

2
Fionnuala

必要な結果を得るための非常に簡単な方法が見つかるまで、表2に存在しない表1のフィールドを返すクエリを取得するのに苦労し、上記の答えのほとんどを試しました。

テーブル1とテーブル2の間の結合プロパティを3番目の設定(3)に設定し(テーブル1のすべてのフィールドと結合されたフィールドが等しいテーブル2のレコードのみ)、クエリの基準フィールドにIs Nullを配置しました私がテストしていた分野の表2で。それは完全に動作します。

上記のすべてに感謝します。

0
Fred Mason