2011-01-31 2 views
1

Рассмотрим пример из MSDN documentation:SQL Server - Регистрация Вопрос - 3 таблицы

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? Или это результат присоединения от A & B?

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

ответ

1

Поскольку существует внутреннее соединение между а и в, только те строки из B, которые соответствуют а будет претендовать на LEFT JOIN к C.

1

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

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

1

Термины «слева» и «справа» в этом контексте не являются достаточно конкретными. Вместо этого вы должны использовать термины «сохраненные» и «незапечатанные». В этом свете таблицы A и B сохраняются, а таблица C является

Ссылка на документацию MSDN подразумевает, что вы не можете использовать объединения (внешние или иные) в предложениях Select, Where, Group By, Have или Order By вне подзапроса (где они все еще находятся в из пункта).

1

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

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

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

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

1

Из вашего присоединяется

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

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

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

select c.* 
from A inner Join B on A.field1 = B.field1 left outer join C on C.field2 = b.Field2 
Смежные вопросы