tablas - unir dos consultas sql misma tabla
Cómo hacer una UNIÓN INTERNA en múltiples columnas (5)
¿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)
Estoy trabajando en un proyecto de tarea y se supone que debo realizar una consulta de base de datos que encuentre vuelos por el nombre de la ciudad o el código del aeropuerto, pero la tabla de flights
solo contiene los códigos del aeropuerto, así que si quiero buscar por ciudad tengo para unirse a la tabla de 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
El fairport
y el tairport
columnas son los códigos desde y hacia el aeropuerto.
Las columnas depart
y arrive
son fechas de salida y llegada.
Se me ocurrió una consulta que primero se une a los vuelos en la columna de fairport
y en la columna de airports.code
. Para poder hacer coincidir el tairport
, tengo que realizar otra unión en las partidas 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 arroja los resultados correctos y será suficiente para los fines de la tarea, pero me pregunto si puedo JOIN
a varias columnas. ¿Cómo construiría la cláusula WHERE
para que coincida con la salida y la ciudad / código de destino?
Debajo hay una "pseudo-consulta" sobre lo que quiero lograr, pero no puedo obtener la sintaxis correctamente y no sé cómo representar la tabla de 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'')
Actualizar
¡También encontré esta representación visual de instrucciones SQL Join para ser muy útil como una guía general sobre cómo construir sentencias SQL!
Puede UNIRSE a la misma tabla más de una vez asignando un alias a las tablas unidas, 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 to_port
y from_port
son alias para la primera y segunda copia de la tabla de airports
.
Si desea buscar en los aeropuertos FROM y TO, querrá unirse a la tabla Airports dos veces; a continuación, puede usar las tablas from y to 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
...
algo como....
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
si mysql está bien para ti:
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 = ''?''
editar: ejemplo agregado para filtrar la salida de código o ciudad