У меня есть 3 таблицы в базе данных следующим образом:
airlines
+----+-----------------+-------+---------+
| Id | Name | Abbr | Country |
+----+-----------------+-------+---------+
| 1 | United Airlines | UAL | USA |
| 2 | US Airways | USAir | USA |
|... | ... | ... | ... |
+----+-----------------+-------+---------+
airports
+--------------+------+-------------+---------------+-------+
| City | Code | Name | Country | CAbbr |
+--------------+------+-------------+---------------+-------+
| Apalachicola | AAF | Municipal | United States | US |
| Abilene | ABI | US Airways | United States | US |
| ... | ... | ... | ... | ... |
+--------------+------+-------------+---------------+-------+
flights
+---------+----------+--------+-------------+
| Airline | FlightNo | Source | Destination |
+---------+----------+--------+-------------+
| 1 | 28 | APG | ASY |
| 1 | 44 | CVO | ACV |
| ... | ... | ... | ... |
+---------+----------+--------+-------------+
Я пытаюсь сообщить обо всех парах аэропортов, обслуживаемых Frontier и JetBlue. Каждая пара аэропортов должна быть сообщена ровно один раз (если сообщается о паре X, Y, тогда пара Y, X является избыточной и не должна сообщаться).
Мне кажется, я понимаю, как получить рейсы Frontier и JetBlue отдельно:
SELECT ap1.Code, ap2.Code
FROM flights f, airports ap1, airports ap2, airlines al
WHERE ap1.Code = f.Source
AND ap2.Code = f.Destination
AND f.Airline = al.Id
AND al.Abbr = 'Frontier'
ORDER BY ap1.Code ASC;
SELECT ap1.Code, ap2.Code
FROM flights f, airports ap1, airports ap2, airlines al
WHERE ap1.Code = f.Source
AND ap2.Code = f.Destination
AND f.Airline = al.Id
AND al.Abbr = 'JetBlue'
ORDER BY ap1.Code ASC;
Но я не понимаю, как получить Пересечение между ними. Я пробовал и LEFT JOIN, и WHERE EXISTS, но я делаю что-то не так, потому что я получаю то, что выглядит скорее как союз, чем пересечение. Вот моя последняя попытка (определенно ошибочная).
SELECT ap1.Code, ap2.Code AS code
FROM airports ap1, airports ap2
WHERE
EXISTS (SELECT ap1.Code, ap2.Code
FROM flights f, airports ap1, airports ap2, airlines al
WHERE ap1.Code = f.Source
AND ap2.Code = f.Destination
AND f.Airline = al.Id
AND al.Abbr = 'Frontier') AND
EXISTS (SELECT ap1.Code, ap2.Code
FROM flights f, airports ap1, airports ap2, airlines al
WHERE ap1.Code = f.Source
AND ap2.Code = f.Destination
AND f.Airline = al.Id
AND al.Abbr = 'JetBlue')
ORDER BY ap1.Code ASC;
И как только пересечение будет найдено, я не совсем уверен, как сделать, чтобы пары X, Y и Y, X отличались друг от друга, потому что DISTINCT не распознает кортежи как одинаковые.
Любая помощь будет высоко ценится.