web-dev-qa-db-ja.com

SQL Server-NOT IN

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で何が間違っていますか?

27
Madam Zu Zu

これは、 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]);
41
Dave Markle

おそらく、文字列を連結するよりも、フィールドを個別に比較する方が良いでしょう。

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
6
Joe Stefanelli
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])
);
1
Kris Ivanov
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つのフィールド名でした

1
Imtiaz

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側が空の行を提供します。

0

1つの問題として、make、model、または[serial number]のいずれかがnullの場合、値が返されないことがあります。 null値を持つ文字列連結は常にnullになり、nullを持つ()ではないため、常に何も返されません。これを解決するには、IsNull(make、 '')+ IsNull(Model、 '')などの演算子を使用します。

0
Shan Plourde