Make-model-serial番号の組み合わせに基づいて、表1にあるが表2にはないレコードを表示するクエリを作成する必要があります。
実際、異なる4つのレコードがあることは知っていますが、クエリは常に空白になります。
SELECT *
FROM Table1 WHERE MAKE+MODEL+[Serial Number] NOT IN
(SELECT make+model+[serial number] FROM Table2)
表1には5つのレコードがあります。
クエリをIN
に変更すると、1つのレコードが取得されます。 NOT
で何が間違っていますか?
これは、 NOT INの動作方法 が原因です。
これらの頭痛を避けるために(そして多くの場合、より高速なクエリのために)、私は常にNOT EXISTSを好みます:
SELECT *
FROM Table1 t1
WHERE NOT EXISTS (
SELECT *
FROM Table2 t2
WHERE t1.MAKE = t2.MAKE
AND t1.MODEL = t2.MODEL
AND t1.[Serial Number] = t2.[serial number]);
おそらく、文字列を連結するよりも、フィールドを個別に比較する方が良いでしょう。
SELECT t1.*
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.MAKE = t2.MAKE
AND t1.MODEL = t2.MODEL
AND t1.[serial number] = t2.[serial number]
WHERE t2.MAKE IS NULL
SELECT [T1].*
FROM [Table1] AS [T1]
WHERE NOT EXISTS (SELECT
1 AS [C1]
FROM [Table2] AS [T2]
WHERE ([T2].[MAKE] = [T1].[MAKE]) AND
([T2].[MODEL] = [T1].[MODEL]) AND
([T2].[Serial Number] = [T1].[Serial Number])
);
SELECT * FROM Table1
WHERE MAKE+MODEL+[Serial Number] not in
(select make+model+[serial number] from Table2
WHERE make+model+[serial number] IS NOT NULL)
それは私のために働いた、make+model+[serial number]
は1つのフィールド名でした
LEFT JOINを使用して右側のヌルをチェックします。
SELECT a.Id
FROM TableA a
LEFT JOIN TableB on a.Id = b.Id
WHERE b.Id IS NULL
上記は、それぞれのId列に基づいてTableAとTableBを照合し、B側が空の行を提供します。
1つの問題として、make、model、または[serial number]のいずれかがnullの場合、値が返されないことがあります。 null値を持つ文字列連結は常にnullになり、nullを持つ()ではないため、常に何も返されません。これを解決するには、IsNull(make、 '')+ IsNull(Model、 '')などの演算子を使用します。