2016-07-26 8 views
1

zu filtern Ich habe Zweifel seit einiger Zeit ... Was ist der beste Weg, um die Einträge auf einem SQL-Join zu filtern .... ich meine, ist besser auf der WHERE-Klausel oder auf der ON der Verbindung?Was ist der beste Weg, Ergebnis auf JOIN (sql)

Zum Beispiel, was ist besser? Dieser Code-Schnipsel mit den WHERE

SELECT 
    customer.users_id AS CustID, 
    FROM customer 
    LEFT JOIN visit ON customer.users_id = visit.CustID 
    WHERE visit.active = 1 

Oder dieser anderen Art und Weise (diese Filter auf dem ON):

SELECT 
    customer.users_id AS CustID, 
    FROM customer 
    LEFT JOIN visit ON (customer.users_id = visit.CustID AND visit.active=1) 

Danke.

+0

Der erste ist die bessere Antwort. – kingtut007

+0

Mein Bauchgefühl sagt mir, dass es Situationen gibt, in denen die beiden Ihnen nicht die gleiche Antwort geben (obwohl ich mir nicht einen von ganz oben vorstellen kann). Unabhängig davon sollten sie in diesen Situationen die gleiche Antwort geben, und die zweite sollte "effizienter" sein. Der SQL-Interpreter ist jedoch ziemlich intelligent, so würde ich annehmen, dass die Anweisungen in der gleichen Zeit laufen würden. Daher kommt es auf Stil an. Im Allgemeinen ist eine where-Klausel besser, weil sie beide Tabellen im JOIN nicht beeinflusst. – BrandonM

Antwort

1

Es hängt von der Art der Situation ab, was auch immer ist. Hier ist ein Text auf beiden: -

Zuerst arbeitet man als Inner Join, ohne wo es alle Zeilen aus der linken Tabelle einschließlich der null in der rechten Tabelle zurückgibt. Wo Bedingung alle Zeilen zurückgeben, die visit 1 haben. Bedeutet es, alle Zeilen aus dem Ergebnis reduziert die aktiven andere dann 1 or null Zeilen entsprechend linke Tabelle haben

Beispiel: -

custome_id visit 
1   1 
2   1 

Zweiter kehrt man Zeilen, die null Einträge entsprechend richtigen Tisch.

Beispiel: -

custome_id visit 
1   1 
2   1 
3   null 
4   null 

Hinweis: - In Ihren beiden Aussagen customer_id kann nicht null sein, da sie nur von links Tisch o/p.

1

Historisch gesehen für mich, seine effiziente, die und Aussage über die zu verwenden verbinden, anstatt sie in der where-Klausel hinzuzufügen.

SELECT 
customer.users_id AS CustID, 
FROM customer 
LEFT JOIN visit ON (customer.users_id = visit.CustID AND visit.active=1) 

Es gibt Fälle, in denen beide Fälle könnte effizienter sein, aber für mich Ich ziehe den und in der Erklärung beitreten werden. Ich glaube, wenn es in der wo Klausel verwendet wird, wenn die Abfrage ausgeführt wird, muss alles in der besuchen Sie die Tabelle dann filtern Sie die Ergebnisse basierend auf visit.active = 1. Dies ist meiner Erfahrung nach schneller, um die Anweisung zu verwenden, und die Leistung hat damit zu tun, wie der Abfrageoptimierer die Daten indiziert.

Update: Für mich beim Umgang mit Millionen von Aufzeichnungen bemerke ich eine bessere Leistung, wo oben gesagt. Wenn die Anzahl der Datensätze kleiner ist, gibt es keinen Unterschied für Sie.