JOIN ... ON ...
Cú pháp bình thường là nổi tiếng. Nhưng cũng có thể định vị ON
mệnh đề riêng biệt với mệnh đề JOIN
tương ứng. Đây là một điều hiếm khi được nhìn thấy trong thực tế, không được tìm thấy trong các hướng dẫn và tôi đã không tìm thấy bất kỳ tài nguyên web nào thậm chí đề cập rằng điều này là có thể.
Đây là một kịch bản để chơi xung quanh:
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 trông bình thường. q2 và q3 có các vị trí bất thường của ON
mệnh đề.
Kịch bản này không nhất thiết có nhiều ý nghĩa. Thật khó cho tôi để có được một kịch bản có ý nghĩa.
Vậy những mẫu cú pháp bất thường này có ý nghĩa gì? Điều này được định nghĩa như thế nào? Tôi nhận thấy rằng không phải tất cả các vị trí và thứ tự cho hai ON
mệnh đề đều được cho phép. Các quy tắc quản lý này là gì?
Ngoài ra có bao giờ là một ý tưởng tốt để viết các truy vấn như thế này?