查询未返回预期数据

Query not returning expected data

我正在寻找以下 3 个查询中的 1 个未返回我所期望的结果的解释。

-- Query 1
SELECT ANNo, ANCpr
FROM Anmodning
WHERE LEFT(ANCpr,6) + '-' + RIGHT(ANCpr,4) NOT IN (SELECT PSCpr FROM Person)

-- Query 2
SELECT ANNo, ANCpr
FROM Anmodning a
LEFT JOIN Person p ON p.PSCpr = LEFT(a.ANCpr,6) + '-' + RIGHT(a.ANCpr,4)
WHERE p.PSNo IS NULL

-- Query 3
SELECT ANNo, ANCpr
FROM Anmodning
WHERE ANNo NOT IN
(
  SELECT ANNo
  FROM Anmodning
  WHERE LEFT(ANCpr,6) + '-' + RIGHT(ANCpr,4) IN (SELECT PSCpr FROM Person)
)

假设如下:
Anmodning with ANNo=1, ANCpr=1111112222
而人 table 没有 与 PSCpr=111111-2222
有一行 在 Management Studio 中针对 SQL Server 2017 执行查询。

按预期查询 2 和 3 returns Anmodning 行,但查询 1 没有。 这是为什么?

我怀疑第一个查询的问题是 null-safety 问题。如果 Person(PSCpr) 中有空值,则 not in 条件过滤掉所有 Anmodning 行,而不管 Person.

中的其他值

考虑这个简单的例子:

select 1 where 1 not in (select 2 union all select null)

Returns 没有行,而:

select 1 where 1 not in (select 2 union all select 3)

Returns 1 如您所料。

当您使用 left join 时,不会发生此问题,如在第二个查询中。

你也可以用 not exists 来表达它,这是 null-安全的,我会在这里推荐:

SELECT ANNo, ANCpr
FROM Anmodning a
WHERE NOT EXITS (SELECT 1 FROM Person p WHERE p.PSCpr = LEFT(a.ANCpr,6) + '-' + RIGHT(a.ANCpr,4))