La JOIN ... ON ...
sintassi normale è ben nota. Ma è anche possibile posizionare la ON
clausola separatamente da JOIN
quella a cui corrisponde. Questo è qualcosa che raramente si vede nella pratica, non si trova nei tutorial e non ho trovato alcuna risorsa web che menzioni nemmeno che ciò sia possibile.
Ecco una sceneggiatura con cui giocare:
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 sembra normale. q2 e q3 hanno questi posizionamenti insoliti della ON
clausola.
Questo script non ha necessariamente molto senso. È stato difficile per me elaborare uno scenario significativo.
Cosa significano questi insoliti schemi di sintassi? Come viene definito? Ho notato che non tutte le posizioni e gli ordini per le due ON
clausole sono consentiti. Quali sono le regole che governano questo?
Inoltre è mai una buona idea scrivere domande come questa?