【问题标题】:Postgresql queries with two subqueries giving error: missing FROM-clause?带有两个子查询的 Postgresql 查询给出错误:缺少 FROM 子句?
【发布时间】:2013-10-11 15:55:44
【问题描述】:

我在查询 6 和 8(如下)时遇到了一些问题。

查询 6: 我还没弄清楚如何获得人口最多的城市的名称。 (其他一切正常)

我需要它做什么: 对于每个国家,列出其任何城市中人口最多的城市以及该城市的名称。订购 结果按国家/地区字母顺序排列。

给出错误: 查询失败:错误:缺少表“city”第 13 行的 FROM 子句条目:ON (city.population = sq.pop) ^

查询 8: 我还没弄清楚如何获得大写名称。 (其他一切正常)

我需要它做什么:对于每个有 5-10 种语言的国家,按降序列出使用的语言数量 语言的数量以及该国家/地区的首都名称。

给出错误: 查询失败:错误:缺少表“城市”第 13 行的 FROM 子句条目:ON (country.capital = city.id) ^

(我不是要求对查询提供完整的解决方案 - 只是修复我拥有的代码的想法)

似乎我需要两个内部连接,但我的语法可能有问题。

单个查询中的两个内连接是否可以接受?

是否存在语法错误? (我检查了在线文档,似乎还可以。但也许我遗漏了一些东西。

有没有比两个内部连接更好的方法来尝试这个?

这里是相关的sn-p代码:(所有其他查询和相关代码都可以正常工作)

    elseif($_POST["query"] == "6")                                          //need help getting name of city with max pop (everything else prints fine)
    {
        $query = "SELECT country.name AS country, largest_city, sq.pop AS population
        FROM lab6.country INNER JOIN 

        (SELECT MAX(city.population) AS pop, country_code 
        FROM lab6.city 
        GROUP BY country_code) AS sq
        USING (country_code)

        INNER JOIN

        (SELECT city.name AS largest_city
        FROM lab6.city) AS sq1
        ON (city.population = sq.pop)

        ORDER BY country.name ASC";
    }
    elseif($_POST["query"] == "8")                      //need help getting capital name (everything else prints fine)
    {
        $query = "SELECT country.name, capital, lang_count
        FROM lab6.country INNER JOIN

        (SELECT count(language) AS lang_count, country_code
        FROM lab6.country_language
        GROUP BY country_code) AS sq
        USING (country_code)

        INNER JOIN

        (SELECT city.name AS capital, city.id
        FROM lab6.city) AS sq1
        ON (country.capital = city.id)

        ORDER BY lang_count DESC, capital DESC";
    }

这已经解决了。这是有效的代码。

    elseif($_POST["query"] == "6")                                          
    {
        $query = "SELECT country.name AS country, largest_city, sq.pop AS population
        FROM lab6.country INNER JOIN 

        (SELECT MAX(city.population) AS pop, country_code 
        FROM lab6.city 
        GROUP BY country_code) AS sq
        USING (country_code)

        INNER JOIN

        (SELECT city.name AS largest_city, city.population
        FROM lab6.city) AS sq1
        ON (sq1.population = sq.pop)

        ORDER BY country.name ASC";
    }
    elseif($_POST["query"] == "8")
    {
        $query = "SELECT country.name, sq1.capital AS capital, lang_count
        FROM lab6.country INNER JOIN

        (SELECT count(language) AS lang_count, country_code
        FROM lab6.country_language
        GROUP BY country_code) AS sq
        USING (country_code)

        INNER JOIN

        (SELECT city.name AS capital, city.id
        FROM lab6.city) AS sq1
        ON (country.capital = sq1.id)

        ORDER BY lang_count DESC, capital DESC";
    }

【问题讨论】:

    标签: sql database postgresql subquery inner-join


    【解决方案1】:

    一个表名“city”被派生表别名“sq1”覆盖

    应该是:

     (SELECT city.name AS capital, city.id
        FROM lab6.city) AS sq1
        ON (country.capital = sq1.id)
    

    【讨论】:

    • 这对查询 8 非常有效。我会为查询 6 尝试类似的逻辑。谢谢!
    • 它也适用于查询 6。我将使用更新后的代码进行编辑。
    猜你喜欢
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    相关资源
    最近更新 更多