我肯定犯了一个愚蠢的错误,但我不知道是什么:
在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行
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)
(*)编辑:这个解释非常好,但是我想解决一件事,以防止将来的挑剔。(TRUE或NULL)将评估为TRUE。例如,如果field1 = 3,则这是相关的。该TRUE值将被否定为FALSE,并且该行将被过滤。