#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. спасибо за ответ! Вы мне очень помогли!