2017-03-23 24 views
4

次の2つのクエリでは異なる結果が得られますが、その理由はわかりません。唯一の違いは、1つはINを持ち、もう1つは等価です。異なる結果を返す2つのほぼ同一のクエリ

質問に入る前に、サブクエリを共通のテーブル式に移動してより良い方法を見つけたことを知っておく必要がありますが、これはまだ私を夢中にしています!私は本当に最初の場所で問題の原因を知りたい、私は好奇心から求めてい

ここで最初のクエリです:

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') 

2つ目:

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つ目のクエリは2行を返します。唯一の違いは、最後のwhere句ではx.UniqProducer = x.UniqProducer INです。お時間を

おかげ

+6

おそらく、「SELECT TOP 1」は毎回同じレコードが返されることを保証しないためです。 'ORDER BY'が助けになるはずです。 –

+0

リックに感謝し、そのトリックをしました。サブクエリを単独で実行すると、常に同じ結果が返されるので、私は混乱しました – cjw

答えて

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) 
0

私は理由は、クエリエンジンによって処理される方法equalsinに基づいていること(単語「推測」を重視した)と思います。 equalsの場合、SQLは特定の値との比較を行う必要があることを知っています。inの場合、SQLはサブセットを作成する必要があり、「外側」値が「内部」サブセットであるかどうかを確認します。はい、最終結果はサブクエリから返された行が1行だけであるのと同じになりますが、@RickSが指摘したように、順序を指定することなく、 "上に"終わる値は保証されません。 inドリブンサブクエリを構築するには、equalsプルで使用されるものと異なる場合があります。

フォローアップの質問:正しいデータセットですか?実際のデータを分析すると、ゼロ、2、または異なる数の行が得られるはずですか?

関連する問題