Пересечение SQL - ошибка в синтаксисе

Я пытаюсь найти рейсы, вылетающие из Лондона и прибывающие в Париж. Информация о городах находится в таблице «Аэропорт», а аббревиатуры аэропортов вылета и прилета — в таблице «Полеты».

Вот мой код для проблемы:

SELECT flightNo,flightCompany
FROM Flight
JOIN Airport
ON Airport.airportId=Flight.depAirport
WHERE Airport.city='London'

INTERSECT

SELECT flightNo,flightCompany
FROM Flight
JOIN Airport
ON Airport.airportId=Flight.arrAirport
WHERE Airport.city='Paris';

Он возвращает 3 ошибки -

  • Статус SQL: HY000 Код ошибки: 1000 Синтаксическая ошибка в операторе SQL
  • Статус SQL: HY000 Код ошибки: 1000
  • Статус SQL: HY000 Код ошибки: синтаксическая ошибка 1000, неожиданный конец $, ожидание BETWEEN или IN или SQL_TOKEN_LIKE

person Sick0ne    schedule 21.02.2016    source источник
comment
Какую СУБД вы используете?   -  person a_horse_with_no_name    schedule 22.02.2016
comment
Я использую Либреофис   -  person Sick0ne    schedule 22.02.2016
comment
Это клиентский/интерфейсный инструмент, но какую СУБД вы используете?   -  person a_horse_with_no_name    schedule 22.02.2016
comment
У меня просто есть таблицы, импортированные в Libreoffice через файл .odb. Это не для какого-либо практического применения - просто поиск решения вопроса, заданного нашим универом.   -  person Sick0ne    schedule 22.02.2016
comment
Без понятия. Код, который вы показали, является допустимым SQL. Так что, возможно, какую бы СУБД LibreOffice ни использовал, она этого не поддерживает.   -  person a_horse_with_no_name    schedule 22.02.2016
comment
какая синтаксическая ошибка?   -  person geco17    schedule 22.02.2016
comment
Предполагается ли, что это касается рейсов, вылетающих из Лондона и прибывающих в Париж, или любых рейсов, вылетающих из Лондона, и любых рейсов, прибывающих в Париж?   -  person Brandon    schedule 22.02.2016
comment
Он дает 3 ошибки: статус SQL: HY000 Код ошибки: 1000 Синтаксическая ошибка в инструкции SQL Статус SQL: HY000 Код ошибки: 1000 Статус SQL: HY000 Код ошибки: 1000 синтаксическая ошибка, неожиданный конец $, ожидание BETWEEN или IN или SQL_TOKEN_LIKE   -  person Sick0ne    schedule 22.02.2016
comment
И что говорит ошибка?   -  person Brandon    schedule 22.02.2016
comment
предполагается, что это все рейсы, вылетающие из Лондона и прибывающие в Париж.   -  person Sick0ne    schedule 22.02.2016
comment
Это вся информация, указанная в ошибках.   -  person Sick0ne    schedule 22.02.2016
comment
Можно ли добавить к вопросу пару примерных строк из каждой из таблиц?   -  person tomp    schedule 22.02.2016
comment
imgur.com/a/97VxC вот несколько примеров   -  person Sick0ne    schedule 22.02.2016
comment
FWIW, когда я запускаю ваш запрос в базе данных SQL, совместимой с ANSI, которую использует моя компания, я не получаю никаких синтаксических ошибок, поэтому похоже, что эта проблема может быть особенностью вашего конкретного бэкэнда.   -  person 500 - Internal Server Error    schedule 22.02.2016
comment
Похоже, вы можете получить ошибку, возвращаемую ядром базы данных, запустив команду с помощью параметра «Выполнить команду SQL напрямую» в меню «Правка». Можешь попробовать?   -  person tomp    schedule 22.02.2016
comment
imgur.com/qTzbUok Это будет ошибкой.   -  person Sick0ne    schedule 22.02.2016
comment
И существуют ли эти таблицы на самом деле (вы получаете результаты для select * from flight и для select * from airport)?   -  person 500 - Internal Server Error    schedule 22.02.2016
comment
Да, например, этот запрос работает: ВЫБЕРИТЕ Flight.flightNo, Flight.flightCompany, Flight.depAirport, Flight.arrAirport FROM Flight, Airport WHERE Flight.depAirport = Airport.airportId AND Airport.city = 'Лондон';   -  person Sick0ne    schedule 22.02.2016


Ответы (2)


Как насчет того, чтобы переписать запрос, используя вместо этого JOINs?

SELECT f.flightNo, f.flightCompany
FROM Flight f JOIN
     Airport ad
     ON ad.airportId = f.depAirport AND ad.city = 'London' JOIN
     Airport aa
     ON aa.airportId = f.arrAirport AND aa.city = 'Paris';

Или с помощью EXISTS?

SELECT f.*
FROM Flight f
WHERE EXISTS (SELECT 1
              FROM Airport ad
              WHERE ad.airportId = f.depAirport AND ad.city = 'London'
             ) AND
      EXISTS (SELECT 1
              FROM Airport aa
              WHERE aa.airportId = f.arrAirport AND aa.city = 'Paris'
             );
person Gordon Linoff    schedule 21.02.2016
comment
Я вижу, как это может работать, но по какой-то причине это не выводит никаких результатов (есть комбинация аэропортов, которые должны быть показаны). - person Sick0ne; 22.02.2016
comment
Я не уверен, должен ли я что-либо менять во втором коде, так как я несколько новичок в SQL, но копирование и запуск его в том виде, в котором он написан, дает ошибку: содержимое данных не может быть загружено, таблица не найдена в операторе. - person Sick0ne; 22.02.2016
comment
@Sick0ne . . . Во втором запросе был аэропорт. Возможно, ваша база данных чувствительна к регистру имен таблиц. - person Gordon Linoff; 22.02.2016
comment
Спасибо за ответ. Второй запрос работает по назначению. Однако решил пойти со следующим: SELECT F.flightNo,F.FlightCompany FROM Flight F, Airport A1, Airport A2 WHERE (F.depAirport=A1.airportId AND A1.city='London') AND (F.arrAirport=A2.airportId AND A2.city='Paris') - person Sick0ne; 23.02.2016
comment
@Sick0ne . . . Вы должны научиться использовать правильный явный синтаксис JOIN: никогда не используйте запятые в предложении FROM. - person Gordon Linoff; 24.02.2016

Правила цитирования и чувствительность к регистру с использованием установки LibreOffice Base / HSQLDB 1.8 по умолчанию сложны. Вот что вам нужно сделать:

SELECT "flightNo","flightCompany"
FROM "Flight"
JOIN "Airport"
ON "Airport"."airportId"="Flight"."depAirport"
WHERE "Airport"."city"='London'
INTERSECT
SELECT "flightNo","flightCompany"
FROM "Flight"
JOIN "Airport"
ON "Airport"."airportId"="Flight"."arrAirport"
WHERE "Airport"."city"='Paris';

Или лучше измените ответ Гордона следующим образом:

SELECT F."flightNo", F."flightCompany"
FROM "Flight" F JOIN
     "Airport" AD
     ON AD."airportId" = F."depAirport" AND AD."city" = 'London' JOIN
     "Airport" AA
     ON AA."airportId" = F."arrAirport" AND AA."city" = 'Paris';
person Jim K    schedule 22.02.2016
comment
Видите ли, это то, что Libre Office делает для вас автоматически. Если вы сохраните файл, он сам добавит кавычки - если вы снова откроете свой запрос, он будет выглядеть так. В конце концов решил пойти с этим (и да, второй код Гордона работает): SELECT F.flightNo,F.FlightCompany FROM Flight F, Airport A1, Airport A2 WHERE (F.depAirport=A1.airportId AND A1.city='London') AND (F.arrAirport=A2.airportId AND A2.city='Paris') - person Sick0ne; 23.02.2016