Quel type de jointure SQL est-ce dans lequel la jointure interne n'est pas directement suivie par une clause ON?

Quel est le nom de ce type de jointure? J'ai regardé partout! La requête est interne-back-to-back, puis spécifiant deux clauses ON.

Points bonus: Quel est l'avantage de join cette voie?

SELECT <some columns> FROM ProductTypes AS t0 INNER JOIN Table1 AS t1 INNER JOIN Table2 AS t2 ON t2.CodeId = t1.CodeId AND t2.[Enabled] = 1 ON t1.ClassId = t0.ClassId 

C'est une forme de faire des jointures nestedes. Il n'y a aucun but avec tout intérieur sauf si vous voulez le faire pour la lisibilité. Cela peut être utile si vous utilisez l'extérieur gauche. Considérer:

 SELECT <some columns> FROM ProductTypes AS t0 LEFT OUTER JOIN Table1 AS t1 INNER JOIN Table2 AS t2 ON t2.CodeId = t1.CodeId AND t2.[Enabled] = 1 ON t1.ClassId = t0.ClassId 

Maintenant, cela fait quelque chose. Si vous l'avez fait sans mettre le t1 / t0 à la fin, le t1 / t2 interne annulera fondamentalement le fait que t1 / t0 est un extérieur gauche. Le faire de cette façon vous permet d'avoir t0 loggings sans loggings t1 (tout comme une jointure externe gauche normale), mais montrera seulement les loggings t1 qui ont aussi un t2. La jointure interne est appliquée à ce niveau inférieur.

Voir également:

http://sqlity.net/fr/1435/a-join-a-day-nested-joins/

Format de jointure SQL – jointures internes nestedes

Ce sera toujours INNER JOIN .

Il sera interprété comme

 SELECT <some columns> FROM producttypes AS t0 INNER JOIN table2 AS t2 ON t1.classid = t0.classid INNER JOIN table1 AS t1 ON t2.codeid = t1.codeid AND t2.[enabled] = 1 

Le compilateur est assez intelligent pour réorganiser la command JOIN

Voici une démo de ce qui se passe en interne. J'ai utilisé ma propre table avec une command JOIN similaire

Votre requête

 SELECT * FROM users AS t0 INNER JOIN products AS t1 INNER JOIN orders AS t2 ON t2.productid = t1.productid AND t2.productid = 1 ON t2.uid = t0.uid 

Plan d'exécution

entrez la description de l'image ici

La command JOIN réarrangée

 SELECT * FROM users AS t0 INNER JOIN orders AS t2 ON t2.uid = t0.uid INNER JOIN products AS t1 ON t2.productid = t1.productid AND t2.productid = 1 

Plan d'exécution

entrez la description de l'image ici

Comme vous pouvez le voir, les deux ont un plan d'exécution identique. Donc, il n'y aura pas de différence