Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在查询中查找不在其他查询中的行的不可理解查询结果_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql 在查询中查找不在其他查询中的行的不可理解查询结果

Sql 在查询中查找不在其他查询中的行的不可理解查询结果,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,这个查询的结果让我抓狂 此查询返回29.970行(不同的IdDireccionIne): 此查询返回29.544行(不同的IdDireccionIne): 我想查找第一个查询(29.970行)的IdDireccionIne,它不在第二个查询(29.544)中,我应该得到29.970-29.544=426条记录 select distinct IdDireccionIne from DireccionIne as DI -- 29.970 where IdDireccionIne not in

这个查询的结果让我抓狂

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

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

我想查找第一个查询(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行,左侧为值,右侧为空。但是我仍然不明白为什么我的原始查询没有找到它们。

您可以尝试以下查询:

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)

范围规则应该明确地从子查询from子句中获取IDDIRECCIONE。但是我想知道是否会有一些混乱。

你能试试下面的查询吗:

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)


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

我觉得没问题。。在两个表之间建立联接,如果返回0是因为两个表之间没有匹配值,则应返回第一个查询的所有行。如果第一个查询返回(1,2,3),第二个查询返回(4,5,6),则此查询应返回(1,2,3),因为它不在(4,5,6)中。(或者太晚了,我的大脑正在融化…@elviejo我如何找到第一个查询中不在第二个查询中的所有记录。这不是一个连接。我用的是“不在”。如果我用“in”,你的答案是对的。或者我错了?可能有一些交叉点,但不是全部。在其中一个表中的where为null时进行完全外部联接,然后查看如何确定该值。@如果在第一个表和第二个表之间进行左联接,如果不匹配,则在第二列中会给出null字段。因此,使用where子句过滤字段为null的位置。我觉得biziclop给你的答案很好。。在两个表之间建立联接,如果返回0是因为两个表之间没有匹配值,则应返回第一个查询的所有行。如果第一个查询返回(1,2,3),第二个查询返回(4,5,6),则此查询应返回(1,2,3),因为它不在(4,5,6)中。(或者太晚了,我的大脑正在融化…@elviejo我如何找到第一个查询中不在第二个查询中的所有记录。这不是一个连接。我用的是“不在”。如果我用“in”,你的答案是对的。或者我错了?可能有一些交叉点,但不是全部。在其中一个表中的where为null时进行完全外部联接,然后查看如何确定该值。@如果在第一个表和第二个表之间进行左联接,如果不匹配,则在第二列中会给出null字段。因此,使用where子句过滤字段为null的位置。看看biziclop给你的答案是的,这是一个范围问题。一旦我将作用域添加到子查询中,它就工作得很好。非常感谢你!我从来没有想到这就是问题所在。哇!我认为这是SQLServer2005中的一个bug。但是,从积极的方面来看,它给了你一个很好的理由,给每个表一个别名,并给所有列加上别名作为前缀。@Gordon:这不是一个bug。这是记录在案的行为,尽管人们对其了解甚少。是的,这是我们为每个行集引用(表、视图、内联视图、CTE)提供别名并使用别名限定每个列引用的原因之一。更有问题的(IMO)是现在返回正确结果集的查询,但是当在查询中向另一个表添加同名的列时,可能是“不明确的列”异常,或者(更令人不安的是)现在返回“错误”结果的查询。即使有文档记录,我认为它与SQL标准冲突(我不是100%肯定)如果是这样,我仍然认为它是一个bug。是一个范围问题。一旦我把范围添加到子查询中,它就工作得很好。非常感谢!我从来没有想到这是个问题。哇!我认为这是SQL Server 2005中的一个bug。但是,从积极的一面来看,它给了你一个很好的理由来给每个表一个别名并预置所有的Co。带别名的列。@Gordon:这不是一个bug。这是一种有文档记录的行为,尽管人们对其了解不多。是的,这是我们为每个行集引用(表、视图、内联视图、CTE)提供别名并用别名限定每个列引用的原因之一。问题更多(IMO)是一个现在可以正确返回结果集的查询,但是当向查询中的另一个表添加同名的列时,要么是“不明确的列”异常,要么(更令人不安的是)一个现在返回“错误”结果的查询。即使有文档记录,我认为它与SQL标准冲突(我不是100%肯定)如果是这样,我仍然认为这是一个错误。
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)