Cómo hacer una UNIÓN INTERNA en múltiples columnas


Estoy trabajando en un proyecto de tarea y se supone que debo realizar una consulta de base de datos que encuentra vuelos ya sea por el nombre de la ciudad o el código del aeropuerto, pero la tabla flights solo contiene los códigos del aeropuerto, por lo que si quiero buscar por ciudad tengo que unirme a la tabla airports.

La tabla de aeropuertos tiene las siguientes columnas: code, city
La tabla de vuelos tiene las siguientes columnas: airline, flt_no, fairport, tairport, depart, arrive, fare
Las columnas fairport y tairport son de y a aeropuerto de códigos.
El las columnas depart y arrive son las fechas de salida y llegada.

Se me ocurrió una consulta que primero une los vuelos en la columna fairport y la columna airports.code. Para que coincida con el tairport Tengo que realizar otra unión en los partidos anteriores de la primera unión.

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 = '?')

Mi consulta devuelve los resultados adecuados y será suficiente para el propósito de la tarea, pero me pregunto si puedo JOIN en múltiples columnas? ¿Cómo construiría la cláusula WHERE para que coincide con la salida y la ciudad/código de destino?

A continuación hay una "pseudo-consulta" sobre lo que quiero alcanzar, pero no puedo obtener la sintaxis correctamente y no se cómo representar la tabla airports para las salidas y los destinos:

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')

Actualización

También encontré esta representación visual de las sentencias SQL Join para ser muy útil como una guía general sobre cómo construir sentencias SQL!

 137
Author: Bill the Lizard, 2010-03-03

5 answers

Puede UNIRSE con la misma tabla más de una vez dando a las tablas unidas un alias , como en el siguiente ejemplo:

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='?'

Tenga en cuenta que el to_port y from_port son alias para la primera y segunda copia de la tabla airports.

 118
Author: Daniel Vassallo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-02 21:39:10

Algo así....

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
 22
Author: Paul Creasey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-02 21:14:05

Si mysql está bien para usted:

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 = '?'

Edit: se agregó un ejemplo para filtrar la salida por código o ciudad

 14
Author: Phil Rykoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-02 21:18:35

¿Puedes usar y en la cláusula on?

Por ejemplo, algo como:

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)
 9
Author: ez33,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-03 19:32:45

Si desea buscar en los aeropuertos DESDE y HACIA, querrá unirse a la tabla Aeropuertos dos veces, entonces puede usar las tablas desde y hacia en su conjunto de resultados:

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
 ...
 3
Author: MisterZimbu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-05 04:47:39