【发布时间】:2011-01-22 22:23:06
【问题描述】:
我正在做一个家庭作业项目,我应该执行一个数据库查询,通过城市名称或机场代码查找航班,但 flights 表只包含机场代码,所以如果我想按城市搜索我必须加入airports 表。
airports 表具有以下列:code, city
航班表具有以下列:airline, flt_no, fairport, tairport, depart, arrive, farefairport 和 tairport 列是 from 和 to 机场代码。depart 和 arrive 列是出发和到达日期。
我想出了一个查询,它首先连接 fairport 列和 airports.code 列上的航班。为了让我匹配tairport,我必须对第一次加入的先前匹配执行另一个加入。
SELECT airline, flt_no, fairport, tairport, depart, arrive, fare
FROM (SELECT * FROM flights
INNER JOIN airports
ON flights.fairport = airports.code
WHERE (airports.code = '?' OR airports.city='?')) AS matches
INNER JOIN airports
ON matches.tairport = airports.code
WHERE (airports.code = '?' OR airports.city = '?')
我的查询返回了正确的结果,足以满足作业的目的,但我想知道我是否可以在多个列上使用JOIN?我将如何构造WHERE 子句以使其与出发地和目的地城市/代码相匹配?
下面是关于我想要实现的“伪查询”,但我无法正确获取语法,我不知道如何表示出发地和目的地的 airports 表:
SELECT * FROM flights
INNER JOIN airports
ON flights.fairport = airports.code AND flights.tairport = airports.code
WHERE (airports.code = 'departureCode' OR airports.city= 'departureCity')
AND (airports.code = 'destinationCode' OR airports.city = 'destinationCity')
更新
我还发现this visual representation of SQL Join statements 作为关于如何构建 SQL 语句的一般指南非常很有帮助!
【问题讨论】:
-
提示:您需要为每条记录查找两个城市(一个用于 fairport,另一个用于 tairport。因此可以(确实需要)有 两个 JOIN ,与 airports 表,但其中一个基于 fairport 另一个在 tairport。
-
提示2:因此,您还需要为 airports 表加上别名,以便知道如何区分它们(即,使用 fairport 查找和 tairport 查找的 airport 表)。别名的 SQL 关键字是 AS(尽管它可以省略,即 ...JOIN airports [AS] FA ON FA.code = flight.tairport ...)