Как SQL Server оценивает несколько различных объединений? - PullRequest
0 голосов
/ 31 марта 2010

У меня общий вопрос о том, как сервер sql оценивает объединения. Запрос:

SELECT * 
FROM TableA 
INNER JOIN TableB ON TableB.id = TableA.id
LEFT JOIN TABLEC ON TABLEC.id = TABLEB.id

В1: На каких таблицах основано левое соединение? Я знаю, что это будет основано на TABLEC, но что является другим? Это результат первого внутреннего соединения или TABLEB, указанный в условии левого соединения?

Q2: "LEFT JOIN TABLEC ON TABLEC.id = TABLEB.id" эквивалентно "LEFT JOIN TABLEC ON TABLEB.id = TABLEC.id"

Q3: эквивалентен ли следующий запрос? (с заменой TABLEB.id на TABLEA.id?)

SELECT * 
FROM TableA 
INNER JOIN TableB ON TableB.id = TableA.id
LEFT JOIN TABLEC ON TABLEC.id = TABLEA.id

Спасибо!

Ответы [ 2 ]

2 голосов
/ 31 марта 2010

Q1: оно основано на результате внутреннего соединения, поэтому оно только ВЛЕВО СОЕДИНЯЕТСЯ с элементами, которые находятся в Таблице A И Таблице B.

Q2: Да

Q3: Да, это следствие вопроса Q1.

1 голос
/ 31 марта 2010

SQL является декларативным языком. Когда вы объявляете 'A JOIN B JOIN C', порядок объединения не включается. Конечный результат должен соответствовать требуемым критериям, но базовая реализация может свободно выбирать любой фактический порядок реализации.

На логическом уровне внутренний оператор JOIN является ассоциативным , поэтому порядок не имеет значения: 'JOIN B JOIN C' идентичен 'A JOIN C JOIN B', который идентичен 'B JOIN JOIN C 'и так далее и тому подобное.

...