Je ne comprends pas une clause FROM avec ON dans un endroit inattendu

J'ai hérité d'une requête. C'est le produit de certains concepteurs de requêtes. La forme de la requête est:

select stuff from a join b join c on bk = ck join d on cj = dj on al = dl and am = dm join e on an = en 

Je m'attends à ce qu'une jointure soit join t1 on t1.f = t0.f , comme les deuxième, troisième et quasortingème lignes avec 'join'. Je ne sais pas comment je suis censé lire cette requête avec une table qui n'a pas de 'on' juste après, et plus tard, deux 'on' d'affilée.

Mais le server ne dérange pas. Il returnne un set de données qui nous a bien servis, jusqu'à maintenant lorsque nous voulons changer les choses que nous sélectionnons. Comment le server parsing-t-il cela?

TIA

Vous comprendrez mieux la requête avec des parenthèses:

 select stuff from a join (b join c on bk = ck join d on cj = dj ) on al = dl and am = dm join e on an = en 

Avec les jointures internes, les parenthèses n'ont pas d'importance. Une telle logique peut importer avec des jointures externes, mais franchement, je n'ai jamais trouvé cela nécessaire. Je trouve n'importe quel usage de join sans suite pour être difficile à suivre.

Cela pourrait aider si vous imaginez que SQL Server implique une parenthèse dans votre requête, par exemple

 select stuff from a join ( b join c on bk = ck join d on cj = dj ) on al = dl and am = dm join e on an = en 

Ce qui revient à dire "Rejoignez un au résultat de: b rejoint à c rejoint à d. Et ensuite join e".

Gardez à l'esprit que l'opération de jointure est commutative, c'est-à-dire que l'ordre des jointures ne fait aucune différence pour l'set de résultats. L'optimiseur de requête réorganise généralement les jointures pour get l'ordre de jointure physique le plus performant. Vous pouvez regarder le plan d'exécution pour voir quel ordre de jointure physique réel est sélectionné.

Quoi qu'il en soit maintenant vous devez le changer n'hésitez pas à réécrire dans une forme plus facile à comprendre, par exemple

 select stuff from b join c on bk = ck join d on cj = dj join a on al = dl and am = dm join e on an = en