如何在多列上进行INNER JOIN

Kir*_*ril 157 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 = '?')
Run Code Online (Sandbox Code Playgroud)

我的查询返回正确的结果,这足以满足作业的目的,但我想知道我是否可以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')
Run Code Online (Sandbox Code Playgroud)

更新

我也发现了SQL的语句加入这个可视化表示非常的了解如何构建SQL语句的一般指导帮助!

Dan*_*llo 133

通过为连接表提供别名,您可以多次使用同一个表加入,如下例所示:

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='?'
Run Code Online (Sandbox Code Playgroud)

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

  • 如果机场表很大,那么在多种情况下加入它只会更好一次.有点像 - `航班f INNER JOIN机场a ON a.code = f.fairport或a.code = f.tairport`请建议. (16认同)
  • 哦,我知道为什么:)它应该是INNER JOIN而不是INNER_JOIN ...... DOH! (2认同)

Pau*_*sey 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
Run Code Online (Sandbox Code Playgroud)


Phi*_*off 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 = '?'
Run Code Online (Sandbox Code Playgroud)

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


小智 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)
Run Code Online (Sandbox Code Playgroud)