3

只需要一些快速澄清

我的 Access 数据库中有 2 个查询应该返回反向结果:

SELECT Equipment.title
FROM Equipment
WHERE (((Equipment.[EquipmentID]) Not In (

    select EquipmentID
    from DownPeriod
    where UpDate is null
)));

第二个只是排除了 In 之前的 Not。我的困惑来自这样一个事实,即如果 EquipmentID 字段在 DownPeriod 表中至少有 1 个空值,则上面发布的查询不会返回任何结果。

如果字段被填满,它就可以正常工作,并且反向查询列表始终有效。这让我觉得空值有问题。

现在这个字段永远不应该为空,但我想知道在不太可能发生空值的情况下我是否仍然可以让它工作。

提前谢谢你!

4

2 回答 2

4

尝试加入:

SELECT Equipment.title FROM Equipment INNER JOIN DownPeriod
ON Equipment.EquipmentID = DownPeriod.EquipmentID
WHERE DownPeriod.UpDate is null

SELECT Equipment.title FROM Equipment INNER JOIN DownPeriod
ON Equipment.EquipmentID = DownPeriod.EquipmentID
WHERE DownPeriod.UpDate is not null

看看语法的改变是否能解决你的问题。

这不仅应该有效,而且我相信它比使用这些IN() NOT IN()方法更快(这可能是错误的,但它看起来更好读)。它还增加了快速更改“不为空”标准的能力,就像 IN->NOT IN 一样

于 2012-06-27T15:52:57.030 回答
3

我同意 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)。您要求它向您显示不在该列表中EquipmentEquipmentID行。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
        );
于 2012-06-27T16:36:27.450 回答