Как сделать INNER JOIN на нескольких столбцах - PullRequest
149 голосов
/ 03 марта 2010

Я работаю над проектом домашней работы и должен выполнить запрос к базе данных, который находит рейсы по названию города или коду аэропорта, но таблица flights содержит только коды аэропортов, поэтому, если я хочу поиск по городу Я должен присоединиться к таблице airports.

Таблица аэропортов имеет следующие столбцы: code, city
Таблица полетов имеет следующие столбцы: airline, flt_no, fairport, tairport, depart, arrive, fare
Столбцы fairport и tairport представляют собой от и до кодов аэропортов.
В столбцах 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')

Обновление

Я также нашел это визуальное представление операторов SQL Join , которое было бы очень полезным в качестве общего руководства о том, как создавать операторы SQL!

Ответы [ 5 ]

127 голосов
/ 03 марта 2010

Вы можете присоединиться к одной и той же таблице более одного раза, указав для объединяемых таблиц псевдоним , как в следующем примере:

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_port и from_port являются псевдонимами для первой и второй копий таблицы airports.

24 голосов
/ 03 марта 2010

что-то вроде ....

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
18 голосов
/ 03 марта 2010

если 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 = '?'

edit: добавлен пример для фильтрации вывода по коду или городу

13 голосов
/ 03 мая 2016

Можете ли вы просто использовать и в предложении 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)
3 голосов
/ 03 марта 2010

Если вы хотите выполнять поиск как по аэропортам, так и по аэропортам, вы захотите присоединиться к таблице аэропортов дважды - тогда вы можете использовать таблицы как из таблиц, так и из таблиц в наборе результатов:

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
 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...