2017-07-27 10 views
0

2つのテーブルがあります。Aは400000レコード、Bは350000レコード程度です。SQL(MS-Access) - LEFT JOINを使用して、左テーブルのレコードを右テーブルに表示しない

私は両方のテーブルの違いを表示するためにLEFT JOINを実行していますが、クエリは約100000を返します。

これは私の未-でクエリです:

SELECT * 
FROM TableA LEFT JOIN TableB 
ON TableA.[ID] = TableB.[ID] 
WHERE (TableB.[ID] is null) 

は、何か問題があるのか​​、それはクエリがテーブル間の差よりも、よりを戻すことは可能でしょうか?ありがとう

+1

2つのテーブル間のレコードレコード数の差よりも大きい返された結果があるのは、通常のことです。 「B」には「A」ではないレコードが存在するだけでなく、「A」には「B」にはないレコードも含まれる可能性があります。これが間違っていると思われる場合は、データを詳しく見てください。書かれているように、あなたのクエリは正常に見えます。 – Siyual

+0

あなたはBからのすべての記録がAに存在することを確信していますか? –

+0

私は通常、両方の方向の一致をチェックするために2つのテーブルの間に和集合を作成します。 –

答えて

-2

違い以外は、等価性がNULL値では機能しないため、IDが実際にnullのTableBからいくつかの行を取得する可能性があります。

だから、正しい方法は、他の回答で述べたように、ON句の一部としてNULL条件を設定することで、ない

+1

'' Out' Join'チェックに失敗したレコードだけを選択したいので、 'Null'条件は' Where'節にあることを意図しています。それを 'On'節に移動することは解決策ではなく(' A.Id = B.IdとB.Id Is Null'は決して真実になることはないので)、結果はゼロになります。 – Siyual

+0

アクセスはフィールドと条件が結合ON句に現れることがあります。これはエラーを返します。 –

+0

@Siyual:=では、意味が曖昧であるため、NULLは一貫性のない結果をもたらします。 –

1

あなたのクエリがテーブルで一致していないテーブルAから行を示していあなたは違いをしたい場合B.また、あなたが組合

SELECT * 
    FROM TableA 
    LEFT JOIN TableB ON TableA.[ID] = TableB.[ID] 
    WHERE (TableB.[ID] is null) 
Union All 
SELECT * 
    FROM TableB 
    LEFT JOIN TableA ON TableB.[ID] = TableA.[ID] 
    WHERE (TableA.[ID] is null) 

EDITでこれを行うことができ、表Aに存在しない表Bからの行が必要になります。これは、同様のテーブル構造を前提としています。 select節で*ではなく列名を使用する必要があるかもしれません。

関連する問題