SQL Server - Вопрос о присоединении - 3 таблицы - PullRequest
1 голос
/ 31 января 2011

Рассмотрим пример из документации MSDN :

SELECT p.Name, pr.ProductReviewID
FROM Production.Product p
LEFT OUTER JOIN Production.ProductReview pr
ON p.ProductID = pr.ProductID

В этом примере ясно, что таблица в слева является «Производственной», и именно из нее будут возвращены все строки, а затем только те, которые соответствуют в ProductReview.

Но теперь рассмотрим следующий гипотетический запрос с 3 таблицами A, B, C

.
select * from A
inner Join B on A.field1 = B.field1
left outer join C on C.field2 = b.Field2

Какая левая таблица в этом запросе (из которой будут возвращены все записи, независимо от совпадения с C)? Это А или Б? Или это результат объединения A & B?

Моя путаница возникает из следующей документации MSDN , в которой говорится, что «Внешние объединения могут быть указаны только в предложении FROM», что будет означать, что левой таблицей в моем гипотетическом запросе является A, но затем я У вас нет предложения ON, которое задает условие соединения - в каком случае мой гипотетический запрос плохой?

Ответы [ 5 ]

1 голос
/ 31 января 2011

Из ваших объединений

A inner Join B on A.field1 = B
left outer join C on C.field2 = b.Field2 

Вам нужны записи из таблиц A и B.Левое объединение содержит только данные из таблицы C, поле field2, соответствующее таблице B, но обратите внимание, что таблица A field2 не обязательно должна совпадать.

Чтобы просмотреть данные для таблицы C, выполните следующее:

select c.*
from A inner Join B on A.field1 = B.field1 left outer join C on C.field2 = b.Field2 
1 голос
/ 31 января 2011

Они используют термин предложение FROM в общем (широком) смысле, означающем весь раздел запроса, который начинается с ключевого слова FROM и включает все существующие объединения.

Вот более полный контекст (обратите внимание на предыдущее предложение):

Внутренние объединения могут быть указаны либо в предложениях FROM, либо WHERE. Внешние объединения могут быть указаны только в предложении FROM.

Видите?Они означают, что вы не можете указать внешнее соединение в предложении WHERE, как в случае с внутренними соединениями.Это можно сделать только в предложении FROM (то есть после многих других объединений).Результат будет применен к результату предыдущих объединений.

1 голос
/ 31 января 2011

Термины «левый» и «правый» не являются достаточно конкретными в этом контексте. Вместо этого следует использовать термины «сохраненный» и «незарезервированный». В этом свете таблицы А и В сохраняются, а таблица С не сохраняется. .

Ссылка в документации MSDN подразумевает, что вы не можете использовать объединения (внешние или иные) в предложениях «Выбрать», «Где», «Группировать по», «Имеет» или «Упорядочить по» вне подзапроса (где они все еще находятся в предложении «От») .

1 голос
/ 31 января 2011

Поскольку между А и В есть ВНУТРЕННЕЕ СОЕДИНЕНИЕ, только строки из В, которые соответствуют А, будут претендовать на ЛЕВОЕ СОЕДИНЕНИЕ до С.

1 голос
/ 31 января 2011

Я не уверен на 100%, что понимаю ваш вопрос, но при условии, что я правильно его понимаю:

Ваша "левая" таблица в вашем гипотетическом запросе - B, так как ваше условие ON указывает B.Field2.

...