ВЫБОР с использованием нескольких ПЕРВИЧНЫХ КЛЮЧЕЙ

#sql #postgresql #primary-key #composite-primary-key

#sql #postgresql #первичный ключ #составной первичный ключ

Вопрос:

У меня есть 3 таблицы:

 nation (name PRIMARY KEY);
city (name PRIMARY KEY, nation REFERENCES nation(name))
overflight (number, city, PRIMARY KEY (number, city))
 

Содержимое таблицы пролетов выглядит примерно так, как показано ниже:

 AA11 city1

AA11 city2

BB22 city1

BB22 city3
 

и т.д.

Мне нужно выбрать только пролет, у которого нет города из определенной страны в поле город.

Я пробовал с:

 SELECT number 
FROM overflight 
JOIN city ON overflight.city = city.name 
WHERE overflight.city NOT IN (
  SELECT name FROM city WHERE nation = some_nation
) 
GROUP BY number;
 

но это не работает, потому что в нем не указана строка пролета, в которой указан город из some_nation, но может случиться так, что в том же пролете есть другая строка в таблице, в которой нет города в some_nation. Как я могу отобразить только пролет, у которого вообще нет city в some_nation?

Надеюсь, что я объяснил свою проблему как можно более ясно.

Редактировать
Это точное содержимое таблицы пролета:

 AZ 7255 Rome
AZ 7255 Milan
AZ 608 Rome
AZ 608 New York
AA 1 New York
AA 1 Los Angeles
BA 2430 New York
BA 2430 Los Angeles
 

Предположим, что я хочу показать пролет, который не пролетает ни над одним городом в Италии. Мне нужно, чтобы результат был таким

 AA 1 New York
AA 1 Los Angeles
BB 2430 New York
BB 2430 Los Angeles
 

Ответ №1:

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

 SELECT * FROM overflight 
WHERE number NOT IN (
  SELECT o.number
  FROM overflight o INNER JOIN city c
  ON o.city = c.name
  WHERE c.nation = 'Italy'
)
 

Посмотрите демонстрацию.
Результаты:

число город
AA 1 НЬЮ-ЙОРК
AA 1 Лос-Анджелес
BA 2430 НЬЮ-ЙОРК
BA 2430 Лос-Анджелес

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

1. Я пробовал это решение, но оно возвращает, как показано ниже: AZ 608 New York AA 1 New York AA 1 Los Angeles BA 2430 New York BA 2430 Los Angeles это решение не показывает только строку, в которой город не входит в эту страну, но у меня одинаковый номер в нескольких строках, поэтому, если с этим номером существует полет над городом в этой стране, каждая строка с этим номером не должна отображаться

2. спасибо за ответ! Вы мне очень помогли!