2017-11-21 2 views
1

Ich habe einige Zweifel, wann IN Operator und Exists Operator verwendet werden soll. Ich weiß, was sie beide sind.SQL Server: Verwendung von In vs Exists

Sag mal, ich habe diese Anfrage:

Insert into AuditCardTypeBenefit_New(AuditID, AuditType, CardTypeBenefitID, EventCode, 
            CardTypeGroupID, AgeFrom, AgeTo, Gender, 
            CreateBy, CreateDate, Status, 
            CancelReason, LastChangeBy, LastChangeDate) 
    select     
     AuditID, AuditType, CardTypeBenefitID, EventCode, 
     CardTypeGroupID, AgeFrom, AgeTo, Gender, 
     CreateBy, CreateDate, Status, 
     CancelReason, LastChangeBy, LastChangeDate 
    from 
     AuditCardTypeBenefit 
    where 
     exists (select * from PromotionEvent_New 
       where PromotionEvent_New.EventCode = AuditCardTypeBenefit.EventCode) 

Ich bin Einfügen von Datensätzen in einer Tabelle, wo die Aufzeichnungen auch in promotionevent_new (eventcode) existieren müssen in dieser Tabelle existieren Ich bin Einfügen. Diese Abfrage funktioniert einwandfrei. Ich habe mich gefragt, wäre es besser, eine Alternative zu verwenden, wie zum Beispiel:

where EventCode in (select EVENTCODE from PromotionEvent) 

Beide Abfragen das gleiche Ergebnis zurück - die aber für meinen Fall besser wäre?

Antwort

1

Die EXISTS-Klausel ist viel schneller als IN, wenn die Ergebnisse der Unterabfrage sehr groß sind. Umgekehrt ist die IN-Klausel schneller als EXISTS, wenn die Unterabfrageergebnisse sehr klein sind.

Die IN-Klausel kann nichts mit NULL-Werten vergleichen, aber die EXISTS-Klausel kann alles mit NULL vergleichen.

+0

Also sollte ich mit exists-Klausel bleiben? –

+0

Ja, wenn Ihre Unterabfrage zu großen Daten führt. –

+0

Mit Unterabfrage meinen Sie die Daten in promotionevent_new? –

1

Wäre es besser? Wir können das wirklich nicht wirklich beantworten, da Sie wirklich Tests durchführen müssen. Allerdings bin ich bereit zu sagen, es ist unwahrscheinlich, dass Sie schnellere Ergebnisse erhalten, indem Sie IN() in dieser Abfrage verwenden.

Eine EXISTS-Unterabfrage ist ungewöhnlich, weil sie eine "Korrelation" verwendet, und wir können diese oft als etwas zu vermeidendes betrachten. Das Testen, wenn etwas "existiert", muss jedoch keine gespeicherten Datenwerte zurückgeben, es ist ähnlich wie ein Join in dieser Hinsicht und alles, was notwendig ist, ist, dass wahr oder falsch zurückgegeben wird. Auf der anderen Seite erfordert IN, dass Daten von der Unterabfrage zurückgegeben werden und Werte verglichen werden.

In den letzten Jahren wurde die Leistung von IN() verbessert, so dass es sehr effektiv sein kann, aber in Bezug auf die Leistung gibt es nicht genug erfinderisch, um Ihre bestehende Abfrage zu ändern.

Hinweis: NOT IN (Unterabfrage - hier) leidet, wenn Werte von einer Unterabfrage NULL zurückgegeben werden.

+0

'NB: IN (Unterabfrage-hier) leidet, wenn alle von einer Unterabfrage zurückgegebenen Werte NULL sind: ' NOT IN' leidet, wenn es 'NULL' Wert gibt. "IN" sollte sich wie "EXISTS" verhalten, dh ohne "IS NULL" -Klausel werden die gleichen Werte zurückgegeben. – Rokuto

+0

richtig, sorry, ich werde bearbeiten –