Внешние объединения

В повседневной жизни встречаются ситуации, когда с задачей извлечения из таблиц самой полной информации внутренние объединения не справляются. Например, пусть необходимо вывести названия всех имеющихся в библиотеке книг и список студентов, бравших эти книги, соответственно.

Select Students.FirstName & " " & Students.LastName as Студент, Books.Name

From Students Inner Join

(Books Inner Join S_cards On Books.Id = S_cards.Id_book)

On Students.Id = S_cards.Id_student

Результат выполнения запроса приведен на рисунке

Как можно заметить, проглядев таблицу Books, в результате выполнения запроса отобразились далеко не все книги, присутствующие в библиотеке, а лишь те, которые студенты брали. Это произошло из-за того, что внутреннее объединение отображает только строки, имеющие "пару" в другой таблице, и отбрасывает строки, которые пары не имеют. Чтобы этого избежать необходимо использовать внешнее объединение таблиц. СУБД MS Access поддерживает только два вида внешних объединений - левое и правое. При левом объединении строки таблицы "слева" включаются в результирующую выборку полностью, а строки из таблицы "справа" только строки, имеющие "пару" в "левой" таблице. В качестве пары для строк "левой" таблицы, не имеющих пары, используются пустые (NULL) поля. Все вышесказанное справедливо и для правого объединения с точностью наоборот.

Пример правильного запроса:

Select Books.Name, Students.FirstName & " " & Students.LastName as Студент

From Books Left Outer Join

(S_cards Left Outer Join Students On S_cards.Id_student = Students.Id)

On Books.Id = S_cards.Id_book

Результат выполнения запроса приведен на рисунке

Дуальный пример: вывести полный список студентов и книги, которые они брали в библиотеке соответственно.

Select Students.FirstName & " " & Students.LastName as Студент, Books.Name

From Books Right Outer Join

(S_cards Right Outer Join Students On S_cards.Id_student = Students.Id)

On Books.Id = S_cards.Id_book