Нормальний JOIN ... ON ...
синтаксис добре відомий. Але також можна розташувати ON
пункт окремо від того, JOIN
що йому відповідає. Це те, що рідко зустрічається на практиці, не зустрічається в навчальних посібниках, і я не знайшов жодного веб-ресурсу, який би навіть згадував, що це можливо.
Ось сценарій, з яким можна пограти:
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 виглядає нормально. q2 і q3 мають ці незвичайні позиції ON
пункту.
Цей сценарій не обов'язково має багато сенсу. Мені було важко придумати змістовний сценарій.
То що означають ці незвичайні синтаксичні зразки? Як це визначено? Я зауважив, що не всі позиції та замовлення для двох ON
статей дозволені. Які правила регулюють це?
Також коли-небудь корисно написати такі запити?