首页 > 解决方案 > 选择多个 PRIMARY KEY

问题描述

我有 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 中没有城市的情况。如何仅显示在 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

标签: sqlpostgresqlprimary-keycomposite-primary-key

解决方案


加入表格以获取包含您要排除的国家/地区的城市的飞越编号,并使用运算符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 洛杉矶
巴 2430 纽约
巴 2430 洛杉矶

推荐阅读