0

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

该表有几个依赖项(我们将它们命名为: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 inin,它确实显示了 unionquery 给出的 1997 年记录...

附言。请不要回应表的命名,或者我在这个查询中使用联合而不是内部连接或其他东西的事实。这个问题是关于为什么联合查询不能按预期工作。

4

1 回答 1

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 IN 替换为 NOT EXISTS

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)
于 2013-06-12T10:31:22.930 回答