JOIN ... ON ...
Sintaks normal sudah dikenal. Tetapi juga dimungkinkan untuk menempatkan ON
klausa secara terpisah dari klausa JOIN
yang terkait. Ini adalah sesuatu yang jarang terlihat dalam praktek, tidak ditemukan dalam tutorial dan saya belum menemukan setiap sumber daya web yang bahkan menyebutkan bahwa ini adalah mungkin.
Berikut ini adalah skrip untuk bermain-main:
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 terlihat normal. q2 dan q3 memiliki posisi ON
klausa yang tidak biasa ini .
Skrip ini tidak selalu masuk akal. Sulit bagiku untuk menyusun skenario yang bermakna.
Jadi apa arti dari pola sintaksis yang tidak biasa ini? Bagaimana ini didefinisikan? Saya perhatikan bahwa tidak semua posisi dan pemesanan untuk kedua ON
klausa diperbolehkan. Apa aturan yang mengatur ini?
Juga apakah pernah ada ide bagus untuk menulis pertanyaan seperti ini?