Этот способ написания предложений объединения является одним из способов создания кустарного плана запросов в SQL Server.Оптимизатор запросов обычно рассматривает только объединения, в которых одна сторона объединения является базовым объектом (например, таблица или индексированное представление).
Чтобы создать план, в котором результат одного объединения соединяется непосредственно с результатом другого объединения(пушистый план), нам нужно использовать подсказку FORCE ORDER
и использовать либо синтаксис, показанный в вопросе, либо эквивалентную конструкцию с использованием подзапросов (или общих табличных выражений):
-- Four sample tables
DECLARE @T1 TABLE (ID INT PRIMARY KEY);
DECLARE @T2 TABLE (ID INT PRIMARY KEY);
DECLARE @T3 TABLE (ID INT PRIMARY KEY);
DECLARE @T4 TABLE (ID INT PRIMARY KEY);
-- Some data
INSERT @T1 VALUES (1),(2),(3),(4),(5),(6);
INSERT @T2 VALUES (1),(2),(3),(4);
INSERT @T3 VALUES (2),(4),(6);
INSERT @T4 VALUES (1),(2),(3);
-- Bushy plan
SELECT *
FROM @T1
JOIN @T2
ON [@T2].ID = [@T1].ID
JOIN @T3
JOIN @T4
ON [@T4].ID = [@T3].ID
ON [@T4].ID = [@T2].ID
OPTION (FORCE ORDER);
-- Bushy plan, but note column aliases needed
SELECT *
FROM (
SELECT *
FROM @T1 AS T1
JOIN @T2 AS T2
ON T2.ID = T1.ID
) AS Q1 (ID, ID2)
JOIN (
SELECT *
FROM @T3 AS T3
JOIN @T4 AS T4
ON T4.ID = T3.ID
) AS Q2 (ID3, ID4)
ON Q2.ID4 = Q1.ID2
OPTION (FORCE ORDER);
В«странный» синтаксис, гнездо объединений и операторы ON
не гнездятся ... но это затрудняет чтение TSQL, по крайней мере, на мой взгляд.В редком случае, когда кустистый план будет всегда давать более оптимальный план, чем любое дерево запросов слева или справа, я бы, вероятно, использовал последний синтаксис.