Wie verwende ich MySQL JOIN ohne EIN-Bedingung?

107

Ist es möglich, eine Join-Abfrage ohne ONAnweisung zu schreiben ? und wie wirken sich diese schließt sich unterscheiden LEFT JOIN, RIGHT JOINfunktioniert.

Alexander T.
quelle
1
Da die ONKlausel dem Server mitteilt, wie die Tabellen zusammenhängen, nein. Wenn Ihre verschiedenen Join-Typen alle das gleiche Ergebnis liefern, machen Sie es irgendwie falsch, und das Hinzufügen von Code kann uns helfen, Ihr Problem zu erkennen. In der Zwischenzeit besuchen Sie Jeff Atwoods Blog, um eine zweiminütige Einführung in die verschiedenen Join-Typen zu erhalten.
fvu

Antworten:

153

Die MySQL- Dokumentation behandelt dieses Thema.

Hier ist eine Zusammenfassung. Bei Verwendung von joinoder inner joinist die onBedingung optional. Dies unterscheidet sich vom ANSI-Standard und von fast jeder anderen Datenbank. Der Effekt ist a cross join. Ebenso können Sie eine onKlausel mit verwenden cross join, die sich auch von Standard-SQL unterscheidet.

Durch eine Kreuzverknüpfung wird ein kartesisches Produkt erstellt, dh jede mögliche Kombination aus 1 Zeile aus der ersten Tabelle und 1 Zeile aus der zweiten. Die Kreuzverknüpfung für eine Tabelle mit drei Zeilen ('a', 'b' und 'c') und eine Tabelle mit vier Zeilen (z. B. 1, 2, 3, 4) hätte 12 Zeilen.

Wenn Sie in der Praxis einen Cross-Join durchführen möchten, verwenden Sie cross join:

from A cross join B

ist viel besser als:

from A, B

und:

from A join B -- with no on clause

Die onKlausel ist für einen rechten oder linken äußeren Join erforderlich, daher ist die Diskussion für sie nicht relevant.

Wenn Sie die verschiedenen Arten von Verknüpfungen verstehen müssen, müssen Sie sich mit relationalen Datenbanken befassen. Stackoverflow ist kein geeigneter Ort für diese Diskussionsebene.

Gordon Linoff
quelle
1
Noch nie von einem Cross Join gehört oder gebraucht ... bis heute!
Wonos
11

Ein Beispiel finden Sie unter http://www.sitepoint.com/understanding-sql-joins-mysql-database/

Sie können 'USING' anstelle von 'ON' wie in der Abfrage verwenden

SELECT * FROM table1 LEFT JOIN table2 USING (id);
Manu
quelle
3
Zur weiteren Verdeutlichung muss die Verbindungsspalte in beiden Tabellen identisch benannt sein, damit USING funktioniert
rmirabelle