【问题标题】:SQL subquery and column naming issueSQL 子查询和列命名问题
【发布时间】:2019-10-07 12:40:07
【问题描述】:

全部成交

  1. 这是正确的代码

    SELECT MAX(inflation_rate) AS max_inf
      FROM (
          SELECT name, continent, inflation_rate
          FROM countries
          INNER JOIN economies
          USING (code)
          WHERE year = 2015) AS subquery
    GROUP BY continent;
    
  2. 这是错误的代码

    SELECT MAX(subquery.economies.inflation_rate) AS max_inf
    FROM
    (SELECT countries.name, countries.continent, economies.inflation_rate
    
    FROM countries
    
    INNER JOIN economies
    
    ON countries.code = economies.code
    
    WHERE economies.year = 2015) AS subquery
    GROUP BY subquery.countries.continent;
    

为什么不允许第二个?

【问题讨论】:

  • 请用您正在使用的 DBMS 标记问题。 SQL Server 还是 PostgreSQL?
  • 你为什么要在这里使用子查询呢?这只是基本的聚合。
  • 子查询中的表名在它之外是不可见的。这是设计使然。
  • 如果帖子包含的信息不足,我深表歉意。下次我会做的正确,谢谢大家:)

标签: sql sql-server database postgresql subquery


【解决方案1】:
SELECT 
    MAX(subquery.economies.inflation_rate) AS max_inf   -- 3
FROM (
    SELECT 
        countries.name,                                 -- 1 
        countries.continent, 
        economies.inflation_rate
    FROM ...) AS subquery                               -- 2
GROUP BY 
    subquery.countries.continent;                       -- 3

您正在使用子查询 (2)。此子查询返回三列:namecontinentinflation_rate (1)。只有这些名称在子查询之外是已知的,而没有别的。所以上级查询不知道列名是从哪里来的。表或表模式无关紧要。

所以对于上级查询,唯一相关的信息是:子查询的名称和列名(3):

SELECT 
    MAX(subquery.inflation_rate) AS max_inf   -- change
FROM (
    SELECT 
        countries.name,                                 
        countries.continent, 
        economies.inflation_rate
    FROM ...) AS subquery                               
GROUP BY 
    subquery.continent;                       -- change

【讨论】:

  • 我很有帮助,非常感谢
【解决方案2】:

因为我假设这是 postgresql,你可以简化它并去掉子查询。

SELECT continent
    , max(inflation_rate) as max_inf
FROM countries
INNER JOIN economies USING (code)
WHERE year = 2015
group by continent

【讨论】:

  • MS SQL Server 的答案会有所不同吗?
  • @jarlh 仅在语法上,因为您不能在 sql server 中使用 using 快捷方式。因为那是来自 OP 的“正确”代码,所以我认为它不能是 sql server。但是只需将连接谓词更改为 ON 就可以了。 :P
【解决方案3】:

你不需要写subquery.countries.continent,因为你有一个子查询并且你重命名了它——所以subquery.continent就足够了

SELECT MAX(subquery.inflation_rate) AS max_inf FROM 
(SELECT countries.name, countries.continent, economies.inflation_rate
FROM countries INNER JOIN economies
ON countries.code = economies.code

WHERE economies.year = 2015) AS subquery
GROUP BY subquery.continent

【讨论】:

  • 类似subquery.inflation_rate.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
相关资源
最近更新 更多