2011-01-10 2 views
0

Sollte SQL Server die gleichen Ergebnisse für die beiden folgenden Abfragen liefern? Der Hauptunterschied besteht darin, dass die Bedingung in die WHERE-Klausel mit der ersteren gestellt wird und diese als Bedingung für die Verknüpfung selbst gesetzt wird.t-sql Bedingungsplatzierung

SELECT * 
FROM cars c 
INNER JOIN parts p 
    ON c.CarID = p.CarID 
WHERE p.Desc LIKE '%muffler%' 

SELECT * 
FROM cars c 
INNER JOIN parts p 
    ON c.CarID = p.CarID 
    AND p.Desc LIKE '%muffler%' 

Vielen Dank im Voraus für jede Hilfe, die ich darauf erhalten!

Antwort

1

Für INNER JOINS wird es keinen Unterschied in Semantik oder Leistung machen. Beide werden denselben Plan geben. Für OUTER JOIN s macht es jedoch einen Unterschied.

/*Will return all rows from cars*/ 
SELECT c.* 
FROM cars c 
LEFT JOIN parts p 
    ON c.CarID = p.CarID AND c.CarID <> c.CarID 


/*Will return no rows*/ 
SELECT c.* 
FROM cars c 
LEFT JOIN parts p 
    ON c.CarID = p.CarID 
WHERE c.CarID <> c.CarID 

Für innere Verbindungen ist das einzige Problem Klarheit. Die Bedingung JOIN sollte (IMO) nur Prädikate enthalten, die sich auf die Beziehung der beiden Tabellen in JOIN beziehen. Andere nicht verwandte Filter sollten in die WHERE Klausel gehen.

0

Bei inneren Joins sollten die beiden Abfragen genau die gleichen Ergebnisse liefern. Siehst du einen Unterschied?

+0

Nein, bin ich nicht. Es ist eigentlich nur etwas, woran ich mich in den letzten paar Jahren ein paar hundert Mal gewundert habe, aber bis jetzt habe ich es versäumt, es herauszufinden. – Jagd

0

Ja, sie erhalten beide die gleichen Ergebnisse. Der Unterschied ist , wenn die Bedingung geprüft wird, wenn während des Beitritts oder danach.

+0

Kann es die Leistung dann beeinträchtigen? – Jagd

+0

Nein, gleicher Ausführungsplan und gleiche Kosten. Sie können beide verwenden. –

0

Der Ausführungsplan ist in Ihrem Beispiel identisch. Neben der Analyse-Schaltfläche sollte die Schaltfläche "Ausführungsplan anzeigen" sein. Es wird dir ein klareres Bild geben.

Ich denke, in einer komplexeren Abfrage mit vielen Joins kann es ein Problem in der Effizienz sein, wie oben erwähnt, vorher oder nachher.

EDIT: Tut mir leid, vorausgesetzt, Sie verwenden sql Server Management Studio.

0

Meine Empfehlung für diese Art von Situation wäre:

  • legten den JOIN Zustand (was stellt die „Verbindung“ zwischen den beiden Tabellen) - und nur diesen JOIN Zustand - nach dem JOIN Betreiber

  • zusätzliche Bedingungen für eine der beiden gehört verknüpften Tabellen in der regulären WHERE Klausel

So 210

auf dieser Grundlage würde ich immer empfehlen, Ihre Abfrage auf diese Weise zu schreiben:

SELECT 
    (list of columns) 
FROM 
    dbo.cars c 
INNER JOIN 
    dbo.parts p ON c.CarID = p.CarID 
WHERE 
    p.Desc LIKE 'muffler%' 

Es scheint „saubere“ und ausdruck auf diese Weise - nicht „verstecken“ zusätzliche Bedingungen hinter einer JOIN Klausel, wenn sie gehören nicht wirklich dorthin (z. B. helfen, die Verbindung zwischen den beiden Tabellen herzustellen, die verbunden werden).