通常のJOIN ... ON ...
構文はよく知られています。ただし、対応するON
句とは別に句を配置することもできJOIN
ます。これは、実際にはめったに見られないものであり、チュートリアルにはありません。また、これが可能であると言及しているWebリソースも見つかりませんでした。
ここで遊ぶスクリプトは次のとおりです。
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
句のこれらの異常な位置があります。
このスクリプトは必ずしもあまり意味がありません。意味のあるシナリオを考え出すのは私にとって困難でした。
これらの異常な構文パターンはどういう意味ですか?これはどのように定義されていますか?2つのON
句のすべての位置と順序が許可されているわけではないことに気付きました。これを管理する規則は何ですか?
また、このようなクエリを書くことは良い考えですか?