35

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ですか?

4

6 に答える 6

46

これは、NOTINが機能する方法によるものです。

これらの頭痛の種を避けるために(そして多くの場合より速いクエリのために)、私は常に存在しないことを好みます:

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]);
于 2011-04-21T19:11:53.693 に答える
6

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

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
于 2011-04-21T19:11:48.353 に答える
2
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つのフィールド名はどこにありましたか

于 2013-01-23T09:32:29.773 に答える
1

LEFT JOINを使用して、右側のnullをチェックします。

SELECT a.Id
FROM TableA a
LEFT JOIN TableB on a.Id = b.Id
WHERE b.Id IS NULL

上記は、それぞれのId列に基づいてTableAとTableBを照合し、B側が空の行を提供します。

于 2011-04-21T19:11:41.547 に答える
1
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])
);
于 2011-04-21T19:19:04.243 に答える
0

1つの問題は、make、model、または[シリアル番号]のいずれかがnullの場合、値が返されないことです。null値を使用した文字列連結は、常にnullになり、nullを使用した()では、常に何も返さないためです。これに対する解決策は、IsNull(make、'')+ IsNull(Model、'')などの演算子を使用することです。

于 2011-04-21T19:13:04.807 に答える