SQL where NOT EQUAL TO 未按预期工作 - SQL Server 2016

-1 sql sql-server-2016

我有以下查询,与使用 = 相比,使用 != (或 <>)时其工作方式有所不同。

我尝试使用的示例的工作原理如下。

SELECT COUNT(*) FROM table1 
Run Code Online (Sandbox Code Playgroud)

返回100

SELECT COUNT(*) 
FROM table1 
WHERE year = '2017/2018' AND SOURCE = 'CSV'
Run Code Online (Sandbox Code Playgroud)

返回30

那么为什么下面的代码不会返回70的计数呢?

SELECT COUNT(*) 
FROM table1 
WHERE year != '2017/2018' AND SOURCE != 'CSV'
Run Code Online (Sandbox Code Playgroud)

当更新为 != 时,它似乎将其视为 OR 而不是 AND,我正在努力找出原因。我通过更改查询以将 NOT EXISTS 与子选择一起使用来解决了这个问题,但最初的问题仍然存在。

Aar*_*and 6

因为有些行的年份是 2017/18 但来源不是 CSV,或者来源是 CSV 但年份不是 2017/18。参见德摩根定律

也许你想要的是:

WHERE NOT (year = '2017/2018' AND SOURCE = 'CSV')
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我通常不太喜欢包装器NOT (),但在这种情况下,它最好地描述了您所追求的语义。你也可以说:

WHERE year <> '2017/2018' OR SOURCE <> 'CSV'
---- important difference ^^
Run Code Online (Sandbox Code Playgroud)

换个角度想一下。停车场有 10 辆车,我们想找出有多少辆车是红色宝马(姑且称之为x),以及有多少辆车不是红色宝马(应该是10 - x):

颜色 制作 红色的? 宝马? 红色和
宝马?
不是
红色?
不是
宝马?
不是红色也不
是宝马?
不是红色还是
不是宝马?
红色的 宝马 是的 是的 是的
红色的 宝马 是的 是的 是的
红色的 宝马 是的 是的 是的
宝马 是的 是的 是的
红色的 本田 是的 是的 是的
紫色的 丰田 是的 是的 是的 是的
绿色的 雷克萨斯 是的 是的 是的 是的
绿色的 丰田 是的 是的 是的 是的
黑色的 福特 是的 是的 是的 是的
橙子 奥迪 是的 是的 是的 是的
是的总和: 4 4 3 6 6 5 7

如果您数出所有既是红色又不是宝马的汽车,您会得到 3。如果您想要它的倒数(剩余 7 辆汽车),您就无法数出所有既不是红色又不是宝马的汽车。这将跳过银色宝马和红色本田,给出 5,而不是 7。您需要计算所有非红色或非宝马的汽车。或者既不是红色不是宝马。