Учебно-практическое пособие москва 2017 ббк



Pdf көрінісі
бет122/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   118   119   120   121   122   123   124   125   ...   243
Байланысты:
Язык SQL. Базовый курс

SELECT count( * )
FROM (
ticket_flights t
JOIN flights f ON t.flight_id = f.flight_id
)
LEFT OUTER JOIN boarding_passes b
ON t.ticket_no = b.ticket_no AND t.flight_id = b.flight_id
WHERE f.actual_departure IS NOT NULL AND b.flight_id IS NULL;
Оказывается, таких пассажиров нет.
count
-------
0
(1 строка)
При формировании запроса вспомним, что таблица «Посадочные талоны»
(boarding_passes) связана с таблицей «Перелеты» (ticket_flights) по внешнему ключу,
а тип связи — 1:1, т. е. каждой строке из таблицы ticket_flights соответствует
не
более
одной строки в таблице boarding_passes: ведь строка в таблицу boarding_passes
добавляется только тогда, когда пассажир прошел регистрацию на рейс. Однако
теоретически, да и практически тоже, пассажир может на регистрацию не явиться,
тогда строка в таблицу boarding_passes добавлена не будет.
Поскольку нас интересуют только рейсы с непустым временем вылета, нам придет-
ся обратиться к таблице «Рейсы» (flights) и соединить ее с таблицей ticket_flights по
атрибуту flight_id. А затем для подключения таблицы boarding_passes мы используем
левое внешнее соединение, т. к. в этой таблице может не оказаться строки, соответ-
ствующей строке из таблицы ticket_flights.
В предложении WHERE второе условие — b.flight_id IS NULL. Оно как раз и позволяет
выявить те комбинированные строки, в которых столбцам таблицы boarding_passes
были назначены значения NULL из-за того, что в ней не нашлось строки, для кото-
рой выполнялось бы условие t.ticket_no = b.ticket_no AND t.flight_id = b.flight_id. Ко-
нечно, мы могли использовать любой столбец таблицы boarding_passes, а не только
b.flight_id, для проверки на NULL.
123


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


Достарыңызбен бөлісу:
1   ...   118   119   120   121   122   123   124   125   ...   243




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет