2012-06-28 66 views
1

我gettintg疯狂与此查询的结果莫名其妙的查询结果寻找一个查询行其不在其他查询

该查询返回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.54 4)我应该得到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中的两个查询的结果,我发现了一些不在第二个结果的第一个结果的记录。我已经检查过很多次了。我不是worng。这有什么问题? 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行与右侧左侧值和空值。但我仍然不明白为什么我的原始查询没有找到它们。

+0

对我来说看起来不错。在两个表之间建立连接,如果返回0是因为两个表之间没有匹配值 –

+0

如果没有,则应该返回第一个查询的所有行。如果第一个查询返回(1,2,3),第二个(4,5,6)这个查询应该返回(1,2,3),因为它不在(4,5,6)中。 (或者太晚了,我的大脑正在融化......) – JotaBe

+0

@ElVieejo如何找到不在第二个查询中的第一个查询的所有记录。这不是一个加入。我正在使用“不在”。如果我使用“in”,你的回答是正确的。或者我错了? – JotaBe

回答

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。但我想知道那里是否会有某种混乱。

+0

是的,这是一个范围问题。一旦我将范围添加到子查询中,它工作正常。非常感谢!我从来没有想到这是问题所在。 – JotaBe

+1

哇!我认为这是SQL Server 2005中的一个错误。但是,从积极的角度来看,它给了你一个很好的理由给每个表一个别名,并在别名前加上所有的列。 –

+0

哇! - 永远都不会有! – user1166147

相关问题