【问题标题】:Trying to find all the cities that there is not a direct flight to from a city (PostgreSQL)试图找到从一个城市没有直飞航班的所有城市(PostgreSQL)
【发布时间】:2013-03-19 06:25:01
【问题描述】:

我正在尝试编写一个查询来确定我无法从某个城市(例如伦敦)直接飞往哪些城市。给定架构:

城市:

| 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

本可以做到这一点,但它没有。有什么帮助吗?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      尝试类似:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多