Характерные ошибки при решении задач на написание запросов на выборку (SELECT)База данных «Аэрофлот»Упражнение 124 |
|||||||||||||
Среди пассажиров, которые пользовались услугами не менее двух авиакомпаний, найти тех, кто совершил одинаковое количество полётов самолетами каждой из этих авиакомпаний. Вывести имена таких пассажиров. Эта задача порождает массу ошибочных решений, которые я разделяю на две группы. К первой группе относятся решения, связанные с неверным прочтением формулировки. Например, пытаются найти двух пассажиров, которые летали бы одинаково двумя или большим числом компаний. Поясню, что рассматривать следует отдельного пассажира и подсчитываеть число полетов, которое он сделал каждой из авиакомпаний, которыми летал. Что дальше? Рассмотрим теперь пример из второй группы ошибочных решений:
Сразу отметим ошибочное DISTINCT name, которое устраняет возможных однофамильцев. Однако не это здесь главное. В предложении FROM соединяются два одинаковых запроса
Соединяются эти запросы по следующим условиям:
Итак, если пассажир совершил, скажем, компанией Aeroflot 3 полета, и также 3 полета он совершил самолетами компании Don_avia, то такой пассажир удовлетворяет условиям соединения и будет выведен в результатах запроса. Если пассажир летал всего двумя компаниями, то это - правильный результат. А если компании три? Если в результате рассмотренного выше подзапроса мы получим
Итак, число полетов пассажира каждой из компаний, которыми он летал, должно находиться в пропорции 1:1:...1. |