WHERE NOT IN returns 一个空集,但它不应该

WHERE NOT IN returns an empty set while it shouldn't

这个查询返回 90 826 行:

SELECT DISTINCT ClientID FROM devices;

现在我检查其中有多少存在于具有相同列的另一个 table 中:

SELECT DISTINCT ClientID FROM devices
WHERE ClientID IN
(
    SELECT DISTINCT ClientID FROM patients
);

这返回 90 736 行,因此 90 行不应该在另一个 table 中。让我们检查一下以确保:

SELECT DISTINCT ClientID FROM devices
WHERE ClientID NOT IN
(
    SELECT DISTINCT ClientID FROM patients
);

但这给了我一个空集,0 行。这不应该是正确的,所以我更进一步,尝试这个:

SELECT DISTINCT ClientID FROM v_keszulekek
WHERE ClientID NOT IN
(
    SELECT DISTINCT ClientID FROM devices
    WHERE ClientID IN
    (
        SELECT DISTINCT ClientID FROM patients
    )
);

这个确实给了我 90 行,但我认为第一个版本应该也能正常工作。

显然我遗漏了什么。

NULL 不是数据类型,您不能使用任何过滤器或子句 IN、NOT IN 等。您必须使用 IS NULL 或 [=13= 明确排除它]IS NOT NULL 条件。在这里,您必须执行以下操作才能获得预期的输出。

SELECT DISTINCT ClientID FROM devices WHERE ClientID IS NOT NULL AND ClientID NOT IN ( SELECT DISTINCT ClientID FROM patients WHERE ClientID IS NOT NULL );