gpt4 book ai didi

mysql - 如果另一个子查询中不存在表别名,那么创建它们有什么意义呢?

转载 作者:行者123 更新时间:2023-11-29 15:32:44 25 4
gpt4 key购买 nike

我有一个表flight,我需要在 mysql 中编写一个 SQL 查询,该查询返回两个特定城市之间最便宜的航类。

我尝试了以下代码

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

但这产生了以下错误。

Table 'AIRLINE.subset' doesn't exist

在查看解决方案后,我发现别名在后续子查询中不可用,并设法通过更改它来使代码运行:

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

这有效。但我想知道如何使用以前的方法运行查询。派生表不能重用吗?如果是这样,如果我们不能使用别名,那么强制我们命名它有何意义。

最佳答案

"I want to know how can I make the query run using previous method. Is it impossible to re-use a derived table?"

嗯,不,这并非不可能。如果您特别想使用第一种查询方法,那么您可以尝试以下操作:

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

但上述查询将返回所有匹配的票值(value),无论 departure_airportarrival_airport 为何。这不需要使用表别名,因为子查询被称为值而不是表。

"what is the point of forcing us to name an alias if we cannot use it?"

实际上我们可以使用它,并且我们需要虚拟表的别名。但不是你第一次查询的方式。 虚拟表是我们通常使用子查询生成的表,在您的情况下是这样的:

(SELECT * 
FROM flight
WHERE departure_airport = 'AMS' AND arrival_airport = 'JFK')

您注意到,当您从表中检索数据时,总是以 SELECT * FROM ... 开头。如果您没有为子查询分配任何别名,您是否期望看到这样的消息?

Error Code: 1146 Table '(SELECT * FROM flight WHERE departure_airport = 'AMS' AND arrival_airport = 'JFK')' doesn't exist

然后这次尝试

WHERE fare = (SELECT MIN(fare) FROM **subset**)

正在尝试从您创建的虚拟表中获取值。子查询内部有一个不同的维度

现在,让我们解决您的查询条件。我假设您想从出发机场 = 'AMS' 和到达机场 = '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;

关于mysql - 如果另一个子查询中不存在表别名,那么创建它们有什么意义呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58560448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com