难以理解的查询结果在查询中查找不在其他查询中的行

时间:2012-06-28 17:35:38

标签: sql sql-server sql-server-2005

我对这个查询的结果感到很疯狂

此查询返回29.970行(不同的IdDireccionIne):

select distinct IdDireccionIne from DireccionIne as DI

此查询返回29.544行(不同的IdDireccionIne):

select distinct IdDireccionIne from DireccionCorregida 
  where IdDireccionIne is not null

我想查找第一个查询(29.970行)的IdDireccionIne,它不在第二个查询中(29.544)我应该得到29.970 - 29.544 = 426记录。

select distinct IdDireccionIne from DireccionIne as DI  -- 29.970
where IdDireccionIne not in
(select distinct IdDireccionIne from DireccionCorregida 
 where IdDireccionIne is not null) -- 29.544

令人惊讶的是我获得了0行!!这个查询出了什么问题?

编辑:我甚至在Excel中复制并粘贴了两个查询的结果,我手工找到了第一个结果中不在第二个结果中的记录。我已经多次检查过了。我没怪。这可能有什么问题? IdDireccionIne是两个表中的int。

第二次编辑:正如一条评论所建议的,如果我这样做:

select * from (select distinct IdDireccionIne from DireccionIne as DI) as T1
full outer join
(select distinct IdDireccionIne from DireccionCorregida 
   where IdDireccionIne is not null) as T2
on T1.IdDireccionIne = T2.IdDireccionIne
where T1.IdDireccionIne is null or T2.IdDireccionIne is null

我得到了预期的426行,左侧是值,右侧是空值。但我仍然不明白为什么我的原始查询找不到它们。

1 个答案:

答案 0 :(得分:4)

您可以尝试以下查询:

select distinct IdDireccionIne
from DireccionIne as DI  -- 29.970
where IdDireccionIne not in (select distinct DireccionCorregida.IdDireccionIne
                             from DireccionCorregida
                             where DireccionCorregida.IdDireccionIne is not null)

范围规则应明确地从子查询子句中获取IdDireccionIne。但我想知道那里是否会有某种混乱。