【问题标题】:Query Returning Too Many Results?查询返回太多结果?
【发布时间】:2013-03-12 02:17:17
【问题描述】:

我试图在查询中获得每个国家/地区任何城市中最多的人口。我需要加入城市和国家表,因为它们位于两个表上,并通过国家代码加入它们。

我有以下疑问:

SELECT country.name         AS country, 
       city.name            AS city, 
       Max(city.population) AS max_pop 
FROM   country 
       INNER JOIN city 
               ON( country.country_code = city.country_code ) 
GROUP  BY country.name, 
          city.name 
ORDER  BY country.name ASC; 

我的想法是从连接表中获取我的国家名称、城市名称和最大值。我假设并测试过,最大值只会给我一个结果,但是在这种情况下它会给我几个!为了让它运行,我在我的 group by 中同时拥有城市和国家/地区名称。

想法?

【问题讨论】:

    标签: sql postgresql max


    【解决方案1】:
    SELECT co.name         AS country,
           ct.name         AS city, 
           t.pop AS max_pop 
    FROM country AS co
          INNER JOIN (
                   SELECT country_code, Max(population) AS pop FROM city GROUP BY country_code
                 ) t ON co.country_code = t.country_code 
          INNER JOIN city AS ct ON ct.population = t.pop AND co.country_code = ct.country_code 
    ORDER  BY country.name ASC; 
    

    【讨论】:

    • 嵌套查询中没有city.name
    • 我的意思不是按谓词分组(这是正确的),但是您在外部查询中选择了它,但它不在连接后的列中
    • 这可以简单得多。我添加了一个答案。
    【解决方案2】:

    更多使用DISTINCT ON(SQL 标准的 PostgreSQL 扩展)更短更快:

    SELECT DISTINCT ON (1)
           co.name       AS country
          ,ci.name       AS city
          ,ci.population AS max_pop
           -- add more columns as you please
    FROM   country co
    JOIN   city    ci USING (country_code)
    ORDER  BY 1, 3 DESC, 2;
    

    如果两个城市在一个国家/地区的人口数量相同,我会在这种情况下按字母顺序选择第一个。这就是我在ORDER BY 子句中添加位置参数2(用于ci.name)的原因。

    我还使用表别名和USING equi-join 进行了简化。

    关于DISTINCT ON

    【讨论】:

    • 哦,我不太了解 postgreSQL,我不知道 DISTINCT ON 的存在。谢谢分享。
    猜你喜欢
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2012-09-05
    • 2023-04-09
    相关资源
    最近更新 更多