4

我正在尝试编写一个查询来确定我不能直接从一个城市飞往哪些城市,比如伦敦。给定架构:

城市:

| 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

会成功的,但它没有。有什么帮助吗?

4

2 回答 2

1

我不能直接从一个城市飞到的城市,比如伦敦。

这意味着一个人可以飞到那里,而不是直接从伦敦。所以(JOIN不是LEFT JOINcity通过:flightdestination_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获得唯一的城市名称,我们就完成了。

对这个问题的更复杂的解释是:
“你可以从伦敦飞到的城市,只是不能直接飞”
但是因为这看起来像基本功课,我不认为他们会期待你的递归查询

于 2013-03-18T22:16:58.957 回答
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')
于 2013-03-18T21:02:17.117 回答