Если псевдоним таблицы не существует в другом подзапросе, какой смысл создавать их? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть таблица flight, и мне нужно написать SQL-запрос в mysql, который возвращает самый дешевый рейс между двумя конкретными городами.

Я попытался следующий код

SELECT * 
FROM (SELECT * 
   FROM flight
   WHERE departure_airport = 'AMS' AND arrival_airport = 'JFK') AS subset
WHERE fare = (SELECT MIN(fare) FROM subset)

Но это привело к следующей ошибке:

Таблица 'AIRLINE.subset' не существует

После просмотра решений я выяснил, что псевдонимы не доступны в последующем подпункте. -запрашивает таким образом, и ему удалось запустить код, изменив его:

SELECT *
FROM flight
WHERE departure_airport = 'AMS' AND arrival_airport = 'JSK'
ORDER BY fare ASC
LIMIT 1

Это работает. Но я хочу знать, как я могу выполнить запрос, используя предыдущий метод. Разве невозможно повторно использовать производную таблицу? И если да, то какой смысл заставлять нас называть псевдоним, если мы не можем его использовать.

1 Ответ

0 голосов
/ 28 октября 2019

"Я хочу знать, как я могу выполнить запрос, используя предыдущий метод. Разве невозможно повторно использовать производную таблицу?"

ХорошоНет, это не невозможно. Если вы хотите использовать первый метод запроса, попробуйте выполнить следующее:

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;
...