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
อนุญาตให้มีตำแหน่งและการสั่งซื้อทั้งหมดสำหรับสองข้อ กฎอะไรที่ควบคุมสิ่งนี้
นอกจากนี้คุณควรเขียนข้อความค้นหาเช่นนี้หรือไม่?