我对以下两个查询得到的结果不同,我不明白为什么。唯一的区别是一个有一个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。
感谢您的时间
答案 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)
我猜(强调“猜测”一词)原因是基于查询引擎处理equals
和in
的方式。对于equals
,SQL知道它需要与特定值进行比较,对于in
,SQL知道它需要构建一个子集,并查找"外部"价值在于内在"内在"子集。是的,最终结果应该与子查询返回的只有1行相同,但正如@RickS指出的那样,没有任何排序,不能保证哪个值最终“在顶部” - 并且使用了(子)查询计划构建in
驱动的子查询可能与equals
拉动使用的子查询不同。
后续问题:哪个是正确的数据集?分析实际数据时,您应该获得零,两行还是不同的行数?