SQL子查询和列命名问题

标签 sql sql-server database postgresql subquery

全部成交

  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;
    

为什么不允许第二个?

最佳答案

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)。此子查询返回三列:名称大陆inflation_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

关于SQL子查询和列命名问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58269748/

相关文章:

mysql - 1292 : Incorrect datetime value: '' for column at row 1

sql-server - 是否可以在 Active Directory 中存储数据库连接字符串信息?

sql - 在sql查询中从dbgeography中提取纬度

sql - 连接具有数百万行的表

sql - 什么是 PostgreSQL 中的类型表?我怎样才能制作这样的 table ?

sql - 获取多对多关系的有效方法

php - 在行之间插入值

android - 如何使用 ContentValues 将 android sqlite 数据库列值更新为 null?

mysql - SQL 百分比 SUM 不同于 100

sql - PIVOT 并复制表的某些列