35

我需要构建一个查询,该查询将根据制造型号序列号组合向我显示表 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

这是因为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]);
于 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]一个字段名称在哪里

于 2013-01-23T09:32:29.773 回答
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 回答
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 侧为空的行。

于 2011-04-21T19:11:41.547 回答
0

一个问题可能是,如果品牌、型号或 [序列号] 为空,则永远不会返回值。因为带有空值的字符串连接总是会导致空值,而不是在 () 中带有空值将始终不返回任何内容。对此的补救措施是使用 IsNull(make, '') + IsNull(Model, '') 等运算符。

于 2011-04-21T19:13:04.807 回答