Comment utiliser mysql JOIN sans condition ON?

106

Est-il possible d'écrire une requête de jointure sans ONinstruction? et comment fonctionnent ces jointures LEFT JOIN, RIGHT JOIN.

Alexander T.
la source
1
Comme la ONclause indique au serveur comment les tables sont liées, non. Si vos différents types de jointures donnent tous le même résultat, vous le faites mal d'une manière ou d'une autre, et l'ajout de code pourrait nous aider à détecter votre problème. En attendant, rendez-vous sur le blog de Jeff Atwood pour une introduction de 2 minutes aux différents types de jointures.
fvu

Réponses:

153

La documentation MySQL couvre ce sujet.

Voici un synopsis. Lorsque vous utilisez joinou inner join, la oncondition est facultative. Ceci est différent de la norme ANSI et différent de presque toutes les autres bases de données. L'effet est un cross join. De même, vous pouvez utiliser une onclause with cross join, qui diffère également du SQL standard.

Une jointure croisée crée un produit cartésien, c'est-à-dire toutes les combinaisons possibles d'une ligne de la première table et d'une ligne de la seconde. La jointure croisée pour une table avec trois lignes («a», «b» et «c») et une table avec quatre lignes (disons 1, 2, 3, 4) aurait 12 lignes.

En pratique, si vous souhaitez effectuer une jointure croisée, utilisez cross join:

from A cross join B

est bien mieux que:

from A, B

et:

from A join B -- with no on clause

La onclause est requise pour une jointure externe droite ou gauche, la discussion n'est donc pas pertinente pour eux.

Si vous avez besoin de comprendre les différents types de jointures, vous devez étudier les bases de données relationnelles. Stackoverflow n'est pas un endroit approprié pour ce niveau de discussion.

Gordon Linoff
la source
1
Jamais entendu parler d'une jointure croisée ou besoin d'une jointure ... jusqu'à aujourd'hui!
goos
11

Voir quelques exemples sur http://www.sitepoint.com/understanding-sql-joins-mysql-database/

Vous pouvez utiliser "USING" au lieu de "ON" comme dans la requête

SELECT * FROM table1 LEFT JOIN table2 USING (id);
Manu
la source
3
Pour plus de précision, la colonne de jointure dans les deux tables doit être nommée de manière identique pour que USING fonctionne
rmirabelle