在我的数据库中,我有一个包含所有文件的表
这个表有几个依赖项(让我们命名它们:FilesDep1,FilesDep2,FilesDep3,FilesDep4,FilesDep5)
files表包含20000多条记录,我需要过滤掉五个依赖项中没有使用的文件。
所以我在FilesDep1
的所有FileId上使用了union作为
select Id from [Files] where Id not in
(
select FileId from [FilesDep1]
union
select FileId from [FilesDep2]
union
select FileId from [FilesDep3]
union
select FileId from [FilesDep4]
union
select FileId from [FilesDep5]
)
所有工会提供的金额是1997年。所以我希望从这个查询获得18000多条记录,但是......它会返回0?
我想知道导致这种行为的原因是什么?
如果我将not in
更改为in
,它确实显示了unionquery给出的1997年记录......
PS。请不要回应表的命名,或者我正在使用union来进行此查询而不是内部联接或其他内容。这个问题是关于联合查询无法按预期工作的原因。
答案 0 :(得分:1)
你可能在某处有FieleID的NULL值吗?如果您的子查询结果中存在单个NULL值,则NOT IN将无法按预期工作。
您可以处理NULL
select Id from [Files] where Id not in
(
select FileId from [FilesDep1] where FileID is NOT NULL
union
select FileId from [FilesDep2] where FileID is NOT NULL
union
select FileId from [FilesDep3] where FileID is NOT NULL
union
select FileId from [FilesDep4] where FileID is NOT NULL
union
select FileId from [FilesDep5] where FileID is NOT NULL
)
或用NOT EXISTS替换NOT IN
select f.Id from [Files] f where NOT EXISTS
(SELECT * FROM
(
select FileId from [FilesDep1]
union
select FileId from [FilesDep2]
union
select FileId from [FilesDep3]
union
select FileId from [FilesDep4]
union
select FileId from [FilesDep5]
) x
WHERE x.FileID = f.ID)