"Я хочу знать, как я могу выполнить запрос, используя предыдущий метод. Разве невозможно повторно использовать производную таблицу?"
ХорошоНет, это не невозможно. Если вы хотите использовать первый метод запроса, попробуйте выполнить следующее:
SELECT *
FROM flight
WHERE fare = (SELECT MIN(fare)
FROM flight
WHERE departure_airport = 'AMS' AND arrival_airport = 'JFK');
Но приведенный выше запрос вернет все соответствующие значения тарифа независимо от departure_airport
и arrival_airport
. И это не требует использования псевдонимов таблиц , потому что подзапрос называется значением вместо таблицы.
«какой смысл заставлять нас называть псевдоним, если мы не можем его использовать?»
На самом деле мы можем использовать его, и мынужен псевдоним для виртуальной таблицы . Но не так, как ваш первый запрос. виртуальная таблица - это таблица, которую мы обычно генерируем с помощью подзапроса, который в вашем случае выглядит следующим образом:
(SELECT *
FROM flight
WHERE departure_airport = 'AMS' AND arrival_airport = 'JFK')
Вы замечаете, что когда вы выполняете поиск данных из таблицы, вы всегда начинаетес SELECT * FROM ...
. Если вы не назначили подзапрос с каким-либо псевдонимом, ожидаете ли вы подобное сообщение?
Код ошибки: 1146 Таблица '(ВЫБРАТЬ * ОТ ПОЛЕТА ГДЕ вылет_airport =' AMS 'И прибытие_порт ='JFK') 'не существует
Затем эта попытка
WHERE fare = (SELECT MIN(fare) FROM **subset**)
пытается получить значение из виртуальной таблицы, которую вы создали. Внутри подзапроса находится другое измерение .
Теперь давайте обратимся к вашему запросу. Я предполагаю, что вы хотите получить самый дешевый тариф у вылета_airport = 'AMS' И прибытия_airport = 'JSK', верно? Тогда, почему бы нам не получить это с помощью одного запроса? примерно так:
SELECT departure_airport,arrival_airport,MIN(fare) AS min_fare
FROM flight
WHERE departure_airport = 'AMS' AND arrival_airport = 'JFK'
GROUP BY departure_airport,arrival_airport;
Как насчет использования подзапроса, но с JOIN
?
SELECT f.*
FROM flight AS f
JOIN (SELECT departure_airport,arrival_airport,MIN(fare) min_fare
FROM flight
WHERE departure_airport = 'AMS'
AND arrival_airport = 'JFK'
GROUP BY departure_airport,arrival_airport) AS subset
ON f.departure_airport = subset.departure_airport
AND f.arrival_airport = subset.arrival_airport
WHERE f.fare = subset.min_fare;