Select Distinct Not In Select Distinct 返回 0 行,应该接近 1000

Select Distinct Not In Select Distinct Returning 0 Rows, Should be almost 1000

Select Distinct FileId From dbo.Files 

returns 3415 行

Select Distinct FileId From dbo.SyncHistory Where Date > '2015/7/1' 

returns 2483 行。

Select Distinct FileId From dbo.Files 
Where FileId In (Select Distinct FileId From dbo.SyncHistory Where Date > '2015/7/1')

returns 2482 行。好吧,有人在这个月进行了同步,但我猜后来删除了他们的文件。

但是:

Select Distinct FileId From dbo.Files 
Where FileId NOT In (Select Distinct FileId From dbo.SyncHistory Where Date > '2015/7/1')

Returns 0 行.

我以为我的连接断开了,但我已经 运行 并重新运行 它并且结果是一致的,即使也一直是错误的。这是 sql 错误吗?我在这里错过了什么?

可能与FileId 列中的空值有关。请检查分别执行的内部和外部查询中的空值。如果您发现空值,那么以下应该有效:

Select Distinct FileId From dbo.Files 
Where FileId In (Select Distinct FileId From dbo.SyncHistory Where Date > '2015/7/1' 
AND FileId IS NOT NULL)

Select Distinct FileId From dbo.Files 
Where FileId NOT In (Select Distinct FileId From dbo.SyncHistory Where Date > '2015/7/1' 
AND FileId IS NOT NULL)

尝试

SELECT DISTINCT
a.FileID
FROM dbo.Files a
LEFT JOIN
(Select Distinct FileId From dbo.SyncHistory Where Date > '2015/7/1') b
ON a.FileID = b.FileID
WHERE b.FileID IS NULL