Erklären JOIN vs. LEFT JOIN-und WHERE-Bedingung der Leistung Vorschlag im detail
In dieser Kandidat beantworten es wird geltend gemacht, dass JOIN
ist besser als LEFT JOIN
unter einigen Umständen mit einigen WHERE
Klauseln, weil es die nicht zu verwechseln ist der query-Planer und ist nicht "sinnlos". Die Behauptung/Vermutung ist, dass es sollte das irgendjemandem offensichtlich sein.
Bitte weiter erläutern oder stellen link(s) für die weitere Lektüre.
Besser? Sie dienen einem anderen Zweck. JOIN ist ein inner join, LEFT JOIN ist ein outer-join (die gleiche wie LEFT OUTER JOIN). Je nach Ihren Absichten Sie entweder eine äußere oder eine innere Verknüpfung. Die WHERE-Klausel sollte nicht verwendet werden, für join-Bedingungen. Es sollte verwendet werden für andere Kriterien, ie. - Filterung.
Ich lese die Antwort "Da das LEFT JOIN (mit DENEN) ist effektiv ein INNER JOIN ist, verwenden Sie einfach einen INNER JOIN statt." Ich bin mir nicht sicher, wie "verwirrend" ist es zu einer [bestimmten] query planner, aber es ist weniger als ideal für die menschliche [gelesen: mein Verbrauch, IMOHO. (Das gleiche kann gesagt werden für die Verwendung einer CROSS-JOIN, wenn eine INNERE genügen würde, zB.)
Ein left join mit where-Klausel, VERWENDET DIE ÄUßEREN verknüpfte TABELLE ist effektiv ein inner join. Allerdings, wenn die where-Klausel nicht mit den äußeren verknüpfte Tabelle, Nein, das ist nicht der Fall.
Ich lese die Antwort "Da das LEFT JOIN (mit DENEN) ist effektiv ein INNER JOIN ist, verwenden Sie einfach einen INNER JOIN statt." Ich bin mir nicht sicher, wie "verwirrend" ist es zu einer [bestimmten] query planner, aber es ist weniger als ideal für die menschliche [gelesen: mein Verbrauch, IMOHO. (Das gleiche kann gesagt werden für die Verwendung einer CROSS-JOIN, wenn eine INNERE genügen würde, zB.)
Ein left join mit where-Klausel, VERWENDET DIE ÄUßEREN verknüpfte TABELLE ist effektiv ein inner join. Allerdings, wenn die where-Klausel nicht mit den äußeren verknüpfte Tabelle, Nein, das ist nicht der Fall.
InformationsquelleAutor Dwayne Towell | 2014-07-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Betrachten Sie das folgende Beispiel. Wir haben zwei Tabellen, ABTEILUNGEN und MITARBEITER.
Einige Abteilungen noch nicht alle Mitarbeiter.
Diese Abfrage, die eine innere Verknüpfung verwendet, findet die Abteilung Mitarbeiter-999 funktioniert, wenn überhaupt, sonst zeigt es nichts an (auch nicht die Mitarbeiter oder seine bzw. Ihre Namen):
Diese nächste Abfrage verwendet einen outer-join (Links zwischen den Abteilungen und Mitarbeitern) und findet in der Abteilung, die Mitarbeiter 999 funktioniert. Aber es wird auch nicht zeigen, Mitarbeiter-ID oder seinen oder Ihren Namen, wenn Sie nicht auf alle Abteilungen. Das ist wegen der äußeren verknüpfte Tabelle in der WHERE-Klausel. Wenn es keine passende Abteilung, es wird null sein (nicht 999, obwohl 999 existiert in Mitarbeiter).
Aber betrachten Sie dieser Abfrage:
Nun die Kriterien, die in der on-Klausel. Also selbst wenn dieser Mitarbeiter arbeitet ohne Abteilungen, er wird noch zurückgegeben werden (seine ID und name). Die Abteilung werden die Spalten null ist, aber wir erhalten ein Ergebnis (der Arbeitnehmerseite).
Könnten Sie denken, dass Sie würde nie wollen, um mit den äußeren verknüpfte Tabelle in der WHERE-Klausel, aber das ist nicht unbedingt der Fall. In der Regel ist es, für den Grund, oben beschrieben, aber.
Angenommen, Sie möchten alle Abteilungen ohne Mitarbeiter. Dann könnten Sie führen Sie den folgenden, die nicht verwenden Sie eine äußere Verknüpfung und der äußeren verknüpfte Tabelle in der where-Klausel:
^^ Zeigt Abteilungen ohne Mitarbeiter.
Den oben genannten ist wahrscheinlich die einzige legitime Grund würden Sie wollen, um eine äußere verknüpfte Tabelle in der WHERE-Klausel anstatt der ON-Klausel (was ich denke ist, was deine Frage ist; der Unterschied zwischen inner und outer-joins ist ein ganz anderes Thema).
Eine gute Art zu betrachten ist: verwenden Sie die outer-joins, um die null-Werte zulassen. Warum sollte man dann verwenden Sie eine äußere Verknüpfung und sagen, dass ein Feld nicht null sein, und der sollte gleich 'XYZ'? Wenn ein Wert 'XYZ' (nicht null), warum dann die Datenbank anweisen, zu erlauben null-Werte zurück zu kommen? Es ist wie gesagt eine Sache und dann das überschreiben später.
InformationsquelleAutor Brian DeMilia
Effektiv
WHERE
Bedingungen undJOIN
Bedingungen für[INNER] JOIN
sind 100 % äquivalent in PostgreSQL. (Es ist gute Praxis, verwenden Sie die expliziteJOIN
Bedingungen Abfragen einfacher zu Lesen und zu warten, obwohl).Das gleiche nicht gilt für eine
LEFT JOIN
kombiniert mit einemWHERE
Zustand auf einer Tabelle auf der rechten Seite des Joins. Der Zweck einerLEFT JOIN
zu bewahren, werden alle Zeilen auf der linken Seite der Verknüpfung, unabhängig von einer übereinstimmung auf der rechten Seite. Wenn keine übereinstimmung gefunden wird, die Zeile wird erweitert mitNULL
Werte für die Spalten auf der rechten Seite. Das Handbuch:Wenn Sie dann eine
WHERE
Bedingung auf Spalten von Tabellen auf der rechten Seite ist, werden Sie zum erlöschen der Wirkung und zwangsweise konvertierenLEFT JOIN
zu arbeiten, wie einem einfachenJOIN
nur teurer durch eine kompliziertere Abfrage-plan.In einer Abfrage mit mehreren verknüpften Tabellen, Postgres (oder beliebigen RDBMS) ist hart setzen, um es zu finden, die besten (oder sogar eine gute) der Abfrage-plan. Die Anzahl der theoretisch möglichen Sequenzen Tabellen verknüpfen, wächst factorially (!). Postgres verwendet die "Generic Query Optimizer" für die Aufgabe und es gibt einige Einstellungen zu beeinflussen.
Verschleierung der Abfrage mit irreführenden
LEFT JOIN
wie dargelegt, macht die Arbeit der query planner härter, ist irreführend für den menschlichen Leser und in der Regel Hinweise auf Fehler in der Abfrage-Logik.Viele Verwandte Antworten für Probleme, die sich aus diesem:
Etc.
Was macht es für einen Unterschied, ob es ist oder ist nicht teurer. Warum würden Sie einen outer join mit Tabelle X, wenn Sie gehen zu sagen, dass die Werte auf Tabelle X etwas dabei sein sollte (außer null)? Wenn überhaupt, dann tun Sie es nicht, weil es einfach keinen Sinn.
Es wird keine große Rolle in einfachen Fällen. Es macht die Aufgabe des abfrageoptimierers schwieriger, in komplexen Fällen, wenn. Aber als Brian kommentiert: tun Sie es nicht, so oder so. Es ist auch sehr verwirrend für den menschlichen Leser.
vielen Dank für die sehr nette Antwort, sorry für die frühere Verwirrung, Brians Beispiel gemacht Dinge sehr klar, so ging ich mit seiner Antwort.
Ich habe ein paar Beispiele zu illustrieren.
InformationsquelleAutor Erwin Brandstetter