一尘不染

SQL查询问题:SELECT ― NOT IN

sql

我肯定犯了一个愚蠢的错误,但我不知道是什么:

在SQL Server 2005中,我尝试选择除在凌晨2点之前进行预订的那些客户以外的所有客户。

当我运行此查询时:

SELECT idCustomer FROM reservations 
WHERE idCustomer NOT IN 
  (SELECT distinct idCustomer FROM reservations 
   WHERE DATEPART ( hour, insertDate) < 2)

我得到0个结果。

SELECT idCustomer FROM reservations

返回152.000结果和“ NOT IN”部分:

SELECT distinct idCustomer FROM reservations 
WHERE DATEPART ( hour, insertDate) < 2

仅返回284行


阅读 193

收藏
2021-03-17

共1个答案

一尘不染

SELECT distinct idCustomer FROM reservations
WHERE DATEPART ( hour, insertDate) < 2
  and idCustomer is not null

确保您的list参数不包含空值。

这是一个解释:

WHERE field1 NOT IN (1, 2, 3, null)

是相同的:

WHERE NOT (field1 = 1 OR field1 = 2 OR field1 = 3 OR field1 = null)
  • 最后一个比较结果为null。
  • 该空值与布尔表达式的其余部分进行“或”运算,产生空值。(*)
  • null被否定,产生null。
  • null是不正确的-where子句仅保留正确的行,因此所有行都将被过滤。

(*)编辑:这个解释非常好,但是我想解决一件事,以防止将来的挑剔。(TRUE或NULL)将评估为TRUE。例如,如果field1 =
3,则这是相关的。该TRUE值将被否定为FALSE,并且该行将被过滤。

2021-03-17