试图找到所有没有从城市直飞的城市(PostgreSQL)

时间:2013-03-18 20:56:01

标签: sql postgresql

我正在尝试编写一个查询,确定哪些城市无法直接从一个城市飞往伦敦。鉴于架构:

城市:

| c_id |   city_name    |   

航班:

| f_id | departure_city_id | destination_city_id |

目前我的查询返回相反的情况,即它返回从伦敦直飞的城市

SELECT c2.city_name as "City"
FROM flights AS f
JOIN cities AS c2 ON f.destination_city_id != c2.c_id
JOIN cities AS c ON c.c_id = c.c_id
WHERE c.city_name = 'London'
AND c.c_id != c2.c_id
AND f.departure_city_id = c.c_id;

我原以为要改变它以获得我想要的东西会很容易。 我想把第三行换成

JOIN cities AS c2 ON f.destination_city_id = c2.c_id

本来可以做到的但却没有。有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

  

城市我不能从一个城市直接飞到伦敦。

意味着一个可以飞到那里,而不是直接来自伦敦。通过JOIN LEFT JOIN(不是cityflightdestination_city_id

SELECT DISTINCT c.city_name
FROM   cities c
JOIN   flights f ON f.destination_city_id = c.c_id
JOIN   cities c2 ON c2.c_id = f.departure_city_id
WHERE  c2.city_name <> 'London';

然后我只需要排除来自伦敦的航班,申请DISTINCT以获取唯一的城市名称,我们就完成了。

对这个问题的更为复杂的解释是:
“你可以从伦敦飞来的城市,而不是直接”
但由于这看起来像基本的家庭作业,我不认为他们会期待你的递归查询

答案 1 :(得分:0)

尝试类似:

SELECT * 
FROM cities c
WHERE c.c_id NOT IN
(SELECT f.destination_city_id
 FROM flights f
 JOIN cities c2 ON f.departure_city_id = c.c_id
 WHERE c2.city_name = 'London')