La JOIN ... ON ...
syntaxe normale est bien connue. Mais il est également possible de positionner la ON
clause séparément de celle à JOIN
laquelle elle correspond. C'est quelque chose qui est rarement vu dans la pratique, que l'on ne trouve pas dans les tutoriels et je n'ai trouvé aucune ressource Web qui mentionne même que cela est possible.
Voici un script pour jouer avec:
SELECT *
INTO #widgets1
FROM (VALUES (1), (2), (3)) x(WidgetID)
SELECT *
INTO #widgets2
FROM (VALUES (1, 'SomeValue1'), (2, 'SomeValue2'), (3, 'SomeValue3')) x(WidgetID, SomeValue)
SELECT *
INTO #widgetProperties
FROM (VALUES
(1, 'a'), (1, 'b'),
(2, 'a'), (2, 'b'))
x(WidgetID, PropertyName)
--q1
SELECT w1.WidgetID, w2.SomeValue, wp.PropertyName
FROM #widgets1 w1
LEFT JOIN #widgets2 w2 ON w2.WidgetID = w1.WidgetID
LEFT JOIN #widgetProperties wp ON w2.WidgetID = wp.WidgetID AND wp.PropertyName = 'b'
ORDER BY w1.WidgetID
--q2
SELECT w1.WidgetID, w2.SomeValue, wp.PropertyName
FROM #widgets1 w1
LEFT JOIN #widgets2 w2 --no ON clause here
JOIN #widgetProperties wp
ON w2.WidgetID = wp.WidgetID AND wp.PropertyName = 'b'
ON w2.WidgetID = w1.WidgetID
ORDER BY w1.WidgetID
--q3
SELECT w1.WidgetID, w2.SomeValue, wp.PropertyName
FROM #widgets1 w1
LEFT JOIN (
#widgets2 w2 --no SELECT or FROM here
JOIN #widgetProperties wp
ON w2.WidgetID = wp.WidgetID AND wp.PropertyName = 'b')
ON w2.WidgetID = w1.WidgetID
ORDER BY w1.WidgetID
q1 semble normal. q2 et q3 ont ces positionnements inhabituels de la ON
clause.
Ce script n'a pas nécessairement beaucoup de sens. Il m'était difficile de concevoir un scénario significatif.
Que signifient donc ces modèles de syntaxe inhabituels? Comment est-ce défini? J'ai remarqué que toutes les positions et commandes pour les deux ON
clauses ne sont pas autorisées. Quelles sont les règles qui régissent cela?
Est-ce également une bonne idée d'écrire des requêtes comme celle-ci?