일반적인 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
조항에 대한 모든 입장과 순서 가 허용되는 것이 아님을 알았다 . 이것을 지배하는 규칙은 무엇입니까?
또한 이런 쿼리를 작성하는 것이 좋은 생각입니까?