2017-03-23 5 views
4

Ich bekomme unterschiedliche Ergebnisse für die folgenden zwei Abfragen und ich habe keine Ahnung warum. Der einzige Unterschied ist, dass man IN hat und man gleich ist.Zwei fast identische Abfragen, die unterschiedliche Ergebnisse liefern

Bevor ich auf die Abfragen eingehe, sollten Sie wissen, dass ich einen besseren Weg gefunden habe, die Unterabfrage in einen gemeinsamen Tabellenausdruck zu verschieben, aber das macht mich immer noch verrückt! Ich möchte wirklich wissen, was das Problem in erster Linie verursacht, ich frage aus Neugier

Hier ist die erste Abfrage:

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

Und die zweite:

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

der ersten Abfrage gibt 0 Zeilen zurück, während die zweite Abfrage 2 Zeilen zurückgibt. Der einzige Unterschied ist x.UniqProducer = gegenüber x.UniqProducer IN für die letzte WHERE-Klausel.

Vielen Dank für Ihre Zeit

+6

Wahrscheinlich, weil 'SELECT TOP 1' nicht garantiert, dass der gleiche Datensatz jedes Mal zurückgegeben wird. Ein 'ORDER BY' sollte helfen. –

+0

danke Rick, das hat den Trick gemacht. Ich war verwirrt, weil das Ausführen der Unterabfrage immer das selbe Ergebnis lieferte – cjw

Antwort

4

SELECT TOP 1 garantiert nicht, dass die gleiche Datensatz jedes Mal zurückgegeben werden. Fügen Sie Ihrer Auswahl eine ORDER BY hinzu, um sicherzustellen, dass derselbe Datensatz zurückgegeben wird.

(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

Ich würde vermuten, (mit einer starken Betonung auf dem Wort „erraten“), dass der Grund auf basiert, wie equals und in durch die Abfrage-Engine verarbeitet werden. Für equals weiß SQL, dass es einen Vergleich mit einem bestimmten Wert durchführen muss, wobei SQL für in weiß, dass es eine Teilmenge erstellen muss und ob der "äußere" Wert in dieser "inneren" Teilmenge enthalten ist. Ja, die Endergebnisse sollten die gleichen sein wie die von der Unterabfrage zurückgegebene Zeile, aber wie @RickS darauf hingewiesen hat, gibt es keine Garantie dafür, welcher Wert "oben" endet - und der verwendete (Unter) Abfrageplan Die in - gesteuerte Unterabfrage kann sich von der von equals gezogenen unterscheiden.

Eine Follow-up-Frage: Welches ist der richtige Datensatz? Wenn Sie die tatsächlichen Daten analysieren, sollten Sie null, zwei oder eine andere Anzahl von Zeilen erhalten haben?

Verwandte Themen