“不在”和“联合”查询中的奇怪行为

时间:2013-06-12 10:22:26

标签: sql union

在我的数据库中,我有一个包含所有文件的表

这个表有几个依赖项(让我们命名它们: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来进行此查询而不是内部联接或其他内容。这个问题是关于联合查询无法按预期工作的原因。

1 个答案:

答案 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)