【问题标题】:Simple inner join not working简单的内部连接不起作用
【发布时间】:2016-04-14 23:54:18
【问题描述】:

我正在尝试查询 CONTINENT 为“亚洲”的所有城市的人口总和。 CITY和COUNTRY这两个表如下,

city - id, countrycode, name population
country - code, name, continent, population

这是我的查询

SELECT SUM(POPULATION) FROM COUNTRY CITY
JOIN ON COUNTRY.CODE = CITY.COUNTRYCODE
WHERE CONTINENT = "Asia";

这不起作用。我究竟做错了什么。我是 SQL 新手。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我知道问题已经得到解答,但我想提出优化的解决方案。以下解决方案将减少执行时间,同时执行 SQL 查询将占用更少的资源。

    select sum(a.population) from city a
    inner join(select * from country where continent = 'Asia') b
    on a.countrycode=b.code;
    

    我想在此基础上解释一下,如您所见,我在执行 Join 操作之前应用了过滤条件。所以在重新洗牌阶段,数据会非常少,这样查询将花费更少的时间来执行。在较小的数据量下您不会看到性能的显着变化,但是在大型数据集中运行此查询时,您可以看到性能提升。

    【讨论】:

      【解决方案2】:

      JOIN 需要在两个表名之间进行:

      SELECT SUM(CITY.POPULATION) FROM COUNTRY INNER JOIN CITY
      ON COUNTRY.CODE = CITY.COUNTRYCODE
      WHERE CONTINENT = "Asia";
      

      【讨论】:

      • 运行SELECT SUM(POPULATION) * ERROR at line 1: ORA-00918: column ambiguously defined 时出现以下错误@
      • @Zeus 请参阅my answer,它可以解决该错误消息。
      【解决方案3】:
      SELECT SUM(CITY.POPULATION) 
      FROM CITY          
      INNER JOIN COUNTRY ON  CITY.COUNTRYCODE = COUNTRY.Code 
      where COUNTRY.CONTINENT = 'Asia';
      

      第 3 行有 INNER JOIN,因为两个表中都有一列是两者共有的

      【讨论】:

        【解决方案4】:

        它不起作用,因为您编写它的方式CITY 被解释为COUNTRY 的表别名。此外,看起来您在每个表中都有一个 POPULATION 列,因此您需要消除歧义。让我为你重写查询:

        SELECT SUM(CITY.POPULATION)
        FROM COUNTRY
        JOIN CITY
        ON COUNTRY.CODE = CITY.COUNTRYCODE
        WHERE COUNTRY.CONTINENT = "Asia";
        

        【讨论】:

        • “亚洲”也不起作用,“亚洲”知道为什么。我是 SQL 新手。两者都是 VARCHAR2
        • 嗯。在 MySQL 中,单引号和双引号都适用于我。你在使用 MySQL 以外的东西吗?
        • 不,这是一个基于 Web 的 MySQL 编译器
        • 什么版本的 MySQL?您可以运行SELECT version(); 来查找。我在 5.6.22 版本中测试过。
        【解决方案5】:
        SELECT sum(city.population) FROM city LEFT JOIN country ON city.countrycode=country.code
        WHERE country.continent='Asia'
        

        【讨论】:

        • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
        【解决方案6】:

        MySQL JOIN syntax manual

        SELECT SUM(COUNTRY.POPULATION) 
        FROM COUNTRY
        JOIN CITY
        ON COUNTRY.CODE = CITY.COUNTRYCODE
        WHERE CONTINENT = "Asia";
        

        【讨论】:

        • 当我运行这个时,我得到的错误信息是,SELECT SUM(POPULATION) * ERROR at line 1: ORA-00918: column ambiguously defined
        • @Zeus 请参阅my answer,它可以解决该错误消息。
        【解决方案7】:

        您可以使用 Oracle 运行以下代码。

        SELECT SUM(c.POPULATION)
        FROM CITY c
             INNER JOIN COUNTRY co  ON c.CountryCode = co.Code
             WHERE CONTINENT ='Asia' ;
        

        【讨论】:

        • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
        【解决方案8】:

        select SUM(cty.POPULATION) from COUNTRY cntry, CITY cty where cty.COUNTRYCODE=cntry.CODE AND cntry.CONTINENT='Asia';

        【讨论】:

        • 社区鼓励在代码中添加解释,而不是纯粹基于代码的答案(参见here)。另外,请查看formatting help page 以改进您的格式。
        【解决方案9】:
        select sum(S.Population)
        from City S
        where S.CountryCode in (select Code
                               from Country C
                               where CONTINENT = 'Asia');
        

        【讨论】:

          猜你喜欢
          • 2013-06-01
          • 2013-09-29
          • 2012-01-11
          • 1970-01-01
          • 2018-10-26
          • 2010-10-10
          • 2015-06-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多