如何在多列上进行INNER JOIN

时间:2010-03-02 21:08:34

标签: sql database

我正在做一个家庭作业项目,我应该执行数据库查询,通过城市名称或机场代码查找航班,但flights表只包含机场代码,所以如果我想要按城市搜索我必须加入airports表。

机场表格包含以下列:code, city
航班表格包含以下列:airline, flt_no, fairport, tairport, depart, arrive, fare
fairporttairport机场代码。
departarrive是出发和到达的日期。

我想出了一个查询,该查询首先加入了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语句的一般指南!

5 个答案:

答案 0 :(得分:124)

您可以通过为连接的表格alias提供多次加入同一个表,如下例所示:

SELECT 
    airline, flt_no, fairport, tairport, depart, arrive, fare
FROM 
    flights
INNER JOIN 
    airports from_port ON (from_port.code = flights.fairport)
INNER JOIN
    airports to_port ON (to_port.code = flights.tairport)
WHERE 
    from_port.code = '?' OR to_port.code = '?' OR airports.city='?'

请注意,to_portfrom_portairports表的第一个和第二个副本的别名。

答案 1 :(得分:24)

像......那样......

SELECT f.*
      ,a1.city as from
      ,a2.city as to
FROM flights f
INNER JOIN airports a1
ON f.fairport = a1. code
INNER JOIN airports a2
ON f.tairport = a2. code

答案 2 :(得分:18)

如果mysql适合你:

SELECT flights.*, 
       fromairports.city as fromCity, 
       toairports.city as toCity
FROM flights
LEFT JOIN (airports as fromairports, airports as toairports)
ON (fromairports.code=flights.fairport AND toairports.code=flights.tairport )
WHERE flights.fairport = '?' OR fromairports.city = '?'

编辑:添加示例以过滤代码或城市的输出

答案 3 :(得分:14)

你能在on子句中使用和吗?

例如:

SELECT 
   airline, flt_no, fairport, tairport, depart, arrive, fare
FROM 
   flights
INNER JOIN 
   airports from_port ON (from_port.code = flights.fairport)
   and (to_port.code = flights.tairport)

答案 4 :(得分:3)

如果要在FROM和TO机场上搜索,您需要两次加入机场表 - 然后您可以在结果集中使用from和to from table:

SELECT
   Flights.*,fromAirports.*,toAirports.*
FROM
   Flights
INNER JOIN 
   Airports fromAirports on Flights.fairport = fromAirports.code
INNER JOIN 
   Airports toAirports on Flights.tairport = toAirports.code
WHERE
 ...