Die normale JOIN ... ON ...
Syntax ist bekannt. Es ist aber auch möglich, die ON
Klausel getrennt von der JOIN
entsprechenden zu positionieren . Dies ist etwas, das in der Praxis selten vorkommt und nicht in Tutorials zu finden ist, und ich habe keine Webressource gefunden, die überhaupt erwähnt, dass dies möglich ist.
Hier ist ein Skript zum Herumspielen:
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 sieht normal aus. q2 und q3 haben diese ungewöhnlichen Positionen der ON
Klausel.
Dieses Skript macht nicht unbedingt viel Sinn. Es fiel mir schwer, ein sinnvolles Szenario zu entwickeln.
Was bedeuten diese ungewöhnlichen Syntaxmuster? Wie ist das definiert? Mir ist aufgefallen, dass nicht alle Positionen und Ordnungen für die beiden ON
Klauseln erlaubt sind. Was sind die Regeln dafür?
Auch ist es jemals eine gute Idee, Fragen wie diese zu schreiben?