2012-03-27 2 views
1

Ich versuche, um zu bestimmen, ob ich WHERE verwenden sollte, oder AND, oder wenn es darauf ankommt:WO Versus UND

FROM table1 

LEFT OUTER JOIN table3 
ON -------- 

JOIN table2 
ON -------- 
AND ------- 
AND -------- 
AND year = ii_year 

Für die letzte Zeile ich auch den folgenden verwenden: WHERE year = ii_year und ich bekomme die gleichen Ergebnisse. Welche sollte ich verwenden? Danke ich eigentlich tun haben eine LEFT OUTER JOIN

+0

lesen http://stackoverflow.com/questions/354070/sql-join -whole-clause-vs-on-Klausel Alle Antworten sind Teilmenge dieses Threads (einschließlich seiner ausgehenden Links;)). Ich hoffe es hilft. – instanceOfObject

Antwort

1

(MySQL für diese Antwort vorausgesetzt).

Wenn es ein INNER JOIN ist, wie in Ihrem Beispiel, macht es keinen Unterschied. Aber wenn Sie eine LEFT OUTER JOIN verwenden und die Bedingungen in die WHERE Klausel setzen, wird es sich wie eine INNER JOIN verhalten.

+0

Ich habe tatsächlich eine LINKE OUTER JOIN direkt unter der FROM und dann ein paar INNER JOINS nach. Also sagst du, dass, weil es zuerst einen LEFT OUTER JOIN gibt, dass irgendetwas in einer folgenden WHERE-Klausel nicht länger als LINK OUTER JOIN fungiert? – doug

+1

@doug: Etwas wie 'SELECT * VON einem LINKEN ÄUSSEREN JOIN b ON b.a_id = a.id WHERE b.type = 'A''wird im Wesentlichen als' INNER JOIN' funktionieren, weil eine Zeile in der Ergebnismenge kann die 'b.type =' A''-Bedingung niemals erfüllen, wenn die Verknüpfung nicht erfolgreich war. Aber etwas wie 'SELECT * VON einem LINKEN ÄUSSEREN JOIN b ON b.a_id = a.id WHERE a.type =' B''ist absolut in Ordnung. – ruakh

+0

Danke @ruakh, schöne Beispiele! – bfavaretto

1

Wenn ich Ihre Frage richtig verstanden habe, ist AND der logische Operator für, wenn zwei Bedingungen in einer WHERE Aussage Muss Rückkehr true gültig. Dies ist die richtige Syntax:

SELECT column 
FROM table 
JOIN othertable ON ... 
WHERE (column > 10) AND (column2 < 1) 
0

Ich persönlich würde eine WHERE-Klausel für die letzten verwenden. Dann verwenden Sie die ANDs für die Felder, die die Tabellen und die WHERE für die Filterung verbinden.

SELECT * 
FROM table1 t1 
    JOIN table2 t2 
    ON t1.field1 = t2.field1 
    AND t1.field2 = t2.field2 
    AND t1.field3 = t2.field3 
WHERE year = ii_year 
1

Sie fragen, ob Sie Abfragen wie folgt schreiben sollte:

SELECT 
FROM table1, table2 
WHERE table1.year = table2.year; 

Versus:

SELECT 
FROM table1 JOIN table2 ON table1.year = table2.year; 

Es gibt keinen Unterschied, spricht logisch. Und die meisten Parser/Abfrage-Engines behandeln sie als identisch. Als Faustregel ich benutze, ist dies:

  • Wenn die Vergleichsbedingung, um beziehen zwei Einheiten, Ort,
  • in einer JOIN-Klausel verwendet wird, wenn der Vergleich stattdessen Filter verwendet wird, die Ergebnismenge, legen, dass in einer WHERE Klausel

ich, dass diese beiden Regeln die Absicht der Abfrage mehr frei halten zu finden. In Ihrem konkreten Beispiel würde ich mehr Informationen benötigen, um wirklich zu entscheiden, in welche Kategorie es fällt.

+1

Das ist absolut * nicht * was das OP verlangt. Beide Abfragevarianten des OP verwenden ANSI-Joins. – ruakh

1

Verwenden Sie WHERE, speichern Sie das Schlüsselwort ON für die Verknüpfung von Tabellen. Es ist bei weitem besser lesbar, und Sie werden keine unerwünschten Ergebnis führen, wenn OUTER JOIN mit ...

3

In der Ausführung der Abfrage, um JOIN ausgeführt, bevor WHERE Zustand Filterung, so Joinbedingungen eine Art Vorfilterung der Ergebnismenge sind.

Für INNER JOIN macht dies keinen Unterschied, aber für OUTER (LINKS/RECHTS) tut.

1

Konzeptuell besteht der Unterschied darin, dass ON Klauseln die Bedingungen angeben, die die beiden Tabellen betreffen (z.ON table2.table1id = table1.id AND table2.is_active = 'Y'), während WHERE Klauseln Bedingungen angeben, die bestimmen, welche Zeilen Sie tatsächlich möchten (z. B. WHERE table1.name LIKE 'Foo %' AND table1.type = 3).

Aber dieser Unterschied, wie Sie gesehen haben, als kein Effekt, wenn Sie eine INNER JOIN verwenden; Es wirkt sich nur auf die Abfrageergebnisse aus, wenn Sie eine LEFT OUTER JOIN oder whatnot haben (wobei eine fehlgeschlagene Bedingung in der ON-Klausel bedeutet, dass Sie Daten aus table2 auslassen, während eine fehlgeschlagene Bedingung in der WHERE-Klausel bedeutet, dass Sie ganze Zeilen aus Ihrer Ergebnismenge herausfiltern).

Also, wenn Sie eine INNER JOIN verwenden, müssen Sie nur entscheiden, welcher Weg scheint eine intuitivere Art, über eine bestimmte Bedingung zu denken. Es gibt nicht immer eine einzige "richtige" Antwort.

0

Auf den ersten Blick scheinen sie sich sehr ähnlich, aber sie sind es nicht. Das Verknüpfen mit mehreren Bedingungen kann zu einem anderen Datensatz führen als das Verknüpfen und Filtern (where-Anweisung).

Zum Beispiel:

SELECT * FROM customer 
JOIN order ON customer.id = order.customerid 
WHERE customer.id = 10 

alle Aufträge Rückkehr für Kunden-ID 10

SELECT * FROM customer 
JOIN order ON customer.id = order.customerid AND order.id = 10 

werden alle Kunden zurück, aber nur um Details für 10 Kunden verbunden sein wird, wird der Rest leer sein (abhängig von der verwendeten Join-Methode)

Wenn Sie INNER JOIN verwenden, dann können Sie ja beides verwenden und der SQL-Optimierer wird die Abfrage für den besten Ausführungsplan ändern.

Wenn Sie OUTER JOIN verwenden dann die zurückgegebene Datenmenge alle Kunden enthalten, jeder Kunde neben id = 10 wird NULL Einträge