При формировании соединений подключение таблиц выполняется слева направо,
т. е. берется самая первая таблица в предложении FROM и с ней соединяется вторая
таблица, затем с полученным набором строк соединяется третья таблица и т. д. Если
требуется изменить порядок соединения таблиц, то могут использоваться круглые
скобки. В приведенном запросе мы использовали круглые скобки для наглядности,
однако в данном случае они не были обязательными. Необходимо различать описан-
ный выше логический порядок соединения таблиц, т. е. взгляд с позиции програм-
миста, пишущего запрос, и тот фактический порядок выполнения запроса, который
будет сформирован планировщиком. Они могут различаться. Подробно о планах вы-
полнения запросов сказано в главе 10.
Теперь рассмотрим более сложный пример. Известно, что в компьютерных системах
бывают сбои. Предположим, что возможна такая ситуация: при бронировании биле-
та пассажир выбрал один класс обслуживания, например, «Business», а при регистра-
ции на рейс ему выдали посадочный талон на то место в салоне самолета, где класс
обслуживания — «Economy». Необходимо выявить все случаи несовпадения классов
обслуживания.
Сведения о классе обслуживания, который пассажир выбрал при бронировании биле-
та, содержатся в таблице «Перелеты» (ticket_flights). Однако в таблице «Посадочные
талоны» (boarding_passes), которая «отвечает» за посадку на рейс, сведений о классе
обслуживания, который пассажир получил при регистрации, нет. Эти сведения мож-
но получить только из таблицы «Места» (seats). Причем, сделать это можно, зная код
модели самолета, выполняющего рейс, и номер места в салоне самолета. Номер места
можно взять из таблицы boarding_passes, а код модели самолета можно получить из
таблицы «Рейсы» (flights), связав ее с таблицей boarding_passes. Для полноты инфор-
мационной картины необходимо получить еще фамилию и имя пассажира из табли-
цы «Билеты» (tickets), связав ее с таблицей ticket_flights по атрибуту «Номер билета»
(ticket_no). При формировании запроса выберем в качестве, условно говоря, базовой
таблицы таблицу boarding_passes, а затем будем поэтапно подключать остальные таб-
лицы. В предложении WHERE будет только одно условие: несовпадение требуемого
и фактического классов обслуживания.
В результате получим запрос, включающий пять таблиц.
Достарыңызбен бөлісу: