我同意 StuckAtWork 的做法。但是,如果您仍然想了解为什么您的原始方法没有产生您想要的结果,我想我可以帮助您。
空字符串可能存在问题,这可能会使情况复杂化。但无论是否涉及空字符串,您都需要考虑一些更基本的问题。
这是我的Equipment
表格版本。
EquipmentID title
1 one
2 two
3 three
这是我的DownPeriod
表格版本。
ID EquipmentID text_field
1 1 one
2 2 two
3 Null
4 3 three
我的表中没有包含您的UpDate
字段DownPeriod
。这与你的问题无关。
我将您的 SQL 粘贴到一个新的 Access 查询中,从子查询中丢弃了该WHERE
子句,并得到与此查询完全相同的结果 --- 没有返回行:
SELECT e.title
FROM Equipment AS e
WHERE
e.EquipmentID Not In (
SELECT EquipmentID
FROM DownPeriod
);
所以从数据库引擎的角度考虑这种情况。使用我的Downloads
表版本,它有一组来自子查询的值(1、2、Null 和 3)。您要求它向您显示不在该值列表中Equipment
的EquipmentID
行。db 引擎只会为您提供该条件为的行。True
Null
是问题所在。对于 each EquipmentID
,当它考虑该值是否不存在于子查询集中时,它不知道。那Null
是一个未知值......并且未知值可能与它正在考虑的当前值相同EquipmentID
......或者可能是其他东西。但由于 db 引擎不知道实际值,它无法将条件评估为True
,因此不会将该行包含在结果集中。表中的每一行都会发生同样的事情Equipment
......因此您的查询结果集是空的(没有行)。
您可以通过Null
使用如下子句从子查询结果集中排除值来获得所需的结果WHERE
。但我认为 StuckAtWork 的建议是一个更好的方法。
SELECT e.title
FROM Equipment AS e
WHERE
e.EquipmentID Not In (
SELECT EquipmentID
FROM DownPeriod
WHERE EquipmentID Is Not Null
);