выберите всех пассажиров, которые приземлились в Пальма-де-Майорке или Барселоне, но не обоих

#sql #mysql-workbench

Вопрос:

Я должен создать заявление, которое удовлетворяет следующему требованию:

Предоставьте список всех пассажиров, которые приземлились либо в аэропорту «Пальма-де-Майорка», либо в «Барселоне». Но ни в коем случае не на обоих.

с помощью этой базы данных: Flughafen-база данных

вот что я придумал:

 select * 
from person
    join passagierliste using (personid)
    join flug using (flugid)
    join flughafen on flug.flughafen_destination=flughafen.flughafenid
where (flughafenid = 'Palma de Mallorca') xor (flughafenid = 'Barcelona')
;
 

но это приводит к следующей ошибке:

Произошла ошибка при выполнении команды SQL: выберите * из списка лиц, присоединяющихся к паролю, используя (идентификатор лица), присоединяющийся к flug, используя (flugid) , присоединяющийся к flughafen на flug.flughafen_… ORA-00933: Неправильно завершена команда SQL [Состояние SQL=42000, код ошибки БД=933]

Время выполнения: 0,03 с

1 утверждение(ы) не выполнено.

Обновить

нашел ошибку, но не ошибку (вместо flughafenid я должен был использовать bezeichnung:

 select * 
from person
    join passagierliste using (personid)
    join flug using (flugid)
    join flughafen on flug.flughafen_destination=flughafen.flughafenid
where (bezeichnung = 'Palma de Mallorca') xor (bezeichnung = 'Barcelona')
;
 

Ответ №1:

Вы можете сгруппироваться по идентификатору лица и посчитать различные описания (bezeichnung) в группе. Из-за этого WHERE пункта вы знаете, что выбираются только описания Майорки или Барселоны. Это означает, что если на человека приходится более 1 отдельного описания, они посетили оба. Используйте это (непроверенное) в качестве CTE или подзапроса, чтобы получить соответствующие данные из person таблицы.

 select person.personid
from person
    join passagierliste using (personid)
    join flug using (flugid)
    join flughafen on flug.flughafen_destination=flughafen.flughafenid
where bezeichnung IN('Palma de Mallorca', 'Barcelona')
group by person.personid
having count(distinct bezeichnung) = 1
 

Комментарии:

1. спасибо, я включил это в подвыборку, чтобы получить всего человека