我需要构建一个查询,该查询将根据制造型号序列号组合向我显示表 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
?
我需要构建一个查询,该查询将根据制造型号序列号组合向我显示表 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 * 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]
一个字段名称在哪里
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])
);
使用 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 侧为空的行。
一个问题可能是,如果品牌、型号或 [序列号] 为空,则永远不会返回值。因为带有空值的字符串连接总是会导致空值,而不是在 () 中带有空值将始终不返回任何内容。对此的补救措施是使用 IsNull(make, '') + IsNull(Model, '') 等运算符。