我正在尝试编写一个查询,确定哪些城市无法直接从一个城市飞往伦敦。鉴于架构:
城市:
| 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
本来可以做到的但却没有。有什么帮助吗?
答案 0 :(得分:1)
城市我不能从一个城市直接飞到伦敦。
意味着一个可以飞到那里,而不是直接来自伦敦。通过JOIN
LEFT JOIN
(不是city
)flight
到destination_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')