2013-03-18 102 views
4

我试图写一个查询,确定哪些城市我不能直接从一个城市飞往伦敦。鉴于模式:试图找到所有没有直飞城市的城市(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 

会做的伎俩,但事实并非如此。任何帮助?

回答

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') 
1

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

含义一个可以从伦敦飞到那里,只是没有直接。所以JOIN(不LEFT JOIN)通过destination_city_idcityflight

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获得独特的城市名称,我们正在做。

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