两个几乎相同的查询返回不同的结果

时间:2017-03-23 16:05:13

标签: sql sql-server

我对以下两个查询得到的结果不同,我不明白为什么。唯一的区别是一个有一个IN,一个有一个等于。

在我进入查询之前,您应该知道我通过将子查询移动到公共表表达式中找到了更好的方法,但这仍然让我发疯!我真的想知道是什么原因引起了这个问题,我出于好奇而

这是第一个查询:

use [DB.90_39733]
Select distinct x.uniqproducer, cn.Firstname,cn.lastname,e.code,
ecn.FirstName, ecn.LastName, ecn.entid, x.uniqline 
from product x
join employ e on e.EmpID=x.uniqproducer
join contactname cn on cn.uniqentity=e.uniqentity 
join [ETL_GAWR92]..idlookupentity ide on ide.enttype='EM' 
                                                        and ide.UniqEntity=e.UniqEntity
left join [ETL_GAWR92]..EntConName ecn on ecn.entid=ide.empid 
                                      and ecn.opt='Y'
Where x.UniqProducer =(SELECT TOP 1 idl.UniqEntity
                               FROM [ETL_GAWR92]..IDLookupEntity idl
                               LEFT JOIN [ETL_GAWR92]..Employ e2 ON e2.ProdID = ''                 
                               WHERE idl.empID = e2.EmpID   AND
                                     idl.EntType     = 'EM')

第二个:

use [DB.90_39733]
    Select distinct x.uniqproducer, cn.Firstname,cn.lastname,e.code,
    ecn.FirstName, ecn.LastName, ecn.entid, x.uniqline 
    from product x
    join employ e on e.EmpID=x.uniqproducer
    join contactname cn on cn.uniqentity=e.uniqentity 
    join [ETL_GAWR92]..idlookupentity ide on ide.enttype='EM' 
                                                            and ide.UniqEntity=e.UniqEntity
    left join [ETL_GAWR92]..EntConName ecn on ecn.entid=ide.empid 
                                          and ecn.opt='Y'
    Where x.UniqProducer IN (SELECT TOP 1 idl.UniqEntity
                                   FROM [ETL_GAWR92]..IDLookupEntity idl
                                   LEFT JOIN [ETL_GAWR92]..Employ e2 ON e2.ProdID = ''                 
                                   WHERE idl.empID = e2.EmpID   AND
                                         idl.EntType     = 'EM')

第一个查询返回0行,而第二个查询返回2行。唯一的区别是x.UniqProducer =与最后一个where子句的x.UniqProducer IN。

感谢您的时间

2 个答案:

答案 0 :(得分:4)

SELECT TOP 1不保证每次都会返回相同的记录。 在您的选择中添加ORDER BY以确保返回相同的记录。

(SELECT TOP 1 idl.UniqEntity
                               FROM [ETL_GAWR92]..IDLookupEntity idl
                               LEFT JOIN [ETL_GAWR92]..Employ e2 ON e2.ProdID = ''                 
                               WHERE idl.empID = e2.EmpID   AND
                                     idl.EntType     = 'EM' ORDER BY idl.UniqEntity)

答案 1 :(得分:0)

我猜(强调“猜测”一词)原因是基于查询引擎处理equalsin的方式。对于equals,SQL知道它需要与特定值进行比较,对于in,SQL知道它需要构建一个子集,并查找"外部"价值在于内在"内在"子集。是的,最终结果应该与子查询返回的只有1行相同,但正如@RickS指出的那样,没有任何排序,不能保证哪个值最终“在顶部” - 并且使用了(子)查询计划构建in驱动的子查询可能与equals拉动使用的子查询不同。

后续问题:哪个是正确的数据集?分析实际数据时,您应该获得零,两行还是不同的行数?