2010-06-02 13 views
20

Ist der folgenden das effizienteste in SQL sein Ergebnis zu erreichen:SQL: ... WHERE X IN (SELECT Y FROM ...)

SELECT * 
    FROM Customers 
WHERE Customer_ID NOT IN (SELECT Cust_ID FROM SUBSCRIBERS) 

könnten einige Verwendung von Joins besser und erreichen die gleiche Ergebnis?

Antwort

6

Ein Grund, warum Sie es vorziehen, könnte eine verwenden JOIN anstatt NOT IN ist, dass, wenn die Werte in der NOT IN Klausel enthalten keine NULL s werden Sie always get back no results. Wenn Sie NOT IN verwenden, denken Sie daran, immer zu überlegen, ob die Unterabfrage einen NULL-Wert zurückbringen könnte!

RE: Frage in Kommentaren

'x' NOT IN (NULL, 'a', 'b')

≡ 'x' <> NULL und 'x' <> ‚a 'und 'x' <> 'b'

≡ Unbekannt True True

≡ Unbekannt

+0

Willst du sagen, dass SELECT 'A' WHERE 'x' NICHT IN (NULL, 'a', 'b') wäre ein leeres Ergebnis zurückgeben? – CJ7

+2

@Craig - Ja genau. –

2

Vielleicht versuchen diese

Select cust.* 

From dbo.Customers cust 
Left Join dbo.Subscribers subs on cust.Customer_ID = subs.Customer_ID 
Where subs.Customer_Id Is Null 
9

Jede reif genug, um SQL-Datenbank sollte, dass genauso effektiv wie das Äquivalent JOIN ausführen können. Verwenden Sie, was für Sie besser lesbar ist.

+4

+1 das ist richtig - SQL Server wandelt Abfragen vom Typ 'NOT IN' und 'NOT EXISTS' in denselben Ausführungsplan um. – eddiegroves

3
SELECT Customers.* 
    FROM Customers 
WHERE NOT EXISTS (
     SELECT * 
     FROM SUBSCRIBERS AS s 
     JOIN s.Cust_ID = Customers.Customer_ID) 

Wenn „NOT IN“ verwenden, führt die Abfrage vollständigen Tabellenscans verschachtelt, während für „NICHT VORHANDEN“, kann die Abfrage einen Index in der Abfrage Unter verwenden.

+2

Hängt von der Datenbank ab - SQL Server generiert den gleichen Ausführungsplan und führt Indexsuchen durch (wo Indizes vorhanden sind) – eddiegroves

0

Wenn Sie wissen möchten, was effektiver ist, sollten Sie versuchen, die geschätzten Abfragepläne oder die tatsächlichen Abfragepläne nach der Ausführung zu betrachten. Es wird Ihnen die Kosten der Abfragen sagen (ich finde CPU und IO Kosten interessant). Ich wäre nicht sehr überrascht, wenn es wenig oder gar keinen Unterschied gäbe, aber man weiß es nie. Ich habe gesehen, dass bestimmte Abfragen mehrere Kerne auf unserem Datenbankserver verwenden, während eine neu geschriebene Version derselben Abfrage nur einen Kern verwendet (die Abfrage, die alle vier Kerne verwendet hat, war natürlich drei mal schneller). Machen Sie sich nie wirklich klar, warum das so ist, aber wenn Sie mit großen Ergebnismengen arbeiten, können solche Unterschiede auftreten, ohne dass Sie davon wissen.

Verwandte Themen