6.2. Соединения
Третий вариант предусматривает
явное использование декартова произведения
таблиц
. Для этого служит предложение CROSS JOIN. Лишние строки, как и в первом
варианте, отсеиваем с помощью предложения WHERE:
SELECT count( * )
FROM airports a1 CROSS JOIN airports a2
WHERE a1.city <> a2.city;
count
-------
10704
(1 строка)
С точки зрения СУБД эти три варианта эквивалентны и отличаются лишь синтакси-
сом. Для них PostgreSQL выберет один и тот же план (порядок) выполнения запроса.
Теперь обратимся к так называемым
внешним соединениям. Зададимся вопросом:
сколько маршрутов обслуживают самолеты каждого типа? Если не требовать вывода
наименований моделей самолетов, тогда всю необходимую информацию можно по-
лучить из материализованного представления «Маршруты» (routes). Но мы все же
будем выводить и наименования моделей, поэтому обратимся также к таблице «Са-
молеты» (aircrafts). Соединим эти таблицы на основе атрибута aircraft_code,
сгруппируем строки и просто воспользуемся функцией count. В этом запросе внеш-
нее соединение еще не используется.
Достарыңызбен бөлісу: