Подзапрос SQL и проблема с именами столбцов - PullRequest
2 голосов
/ 07 октября 2019

Сделайте все

  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;
    

Почему второй не разрешен?

Ответы [ 3 ]

2 голосов
/ 07 октября 2019
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). Этот подзапрос возвращает три столбца: name, continent, 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
1 голос
/ 07 октября 2019

Поскольку я предполагаю, что это postgresql, вы можете упростить это и избавиться от подзапроса.

SELECT continent
    , max(inflation_rate) as max_inf
FROM countries
INNER JOIN economies USING (code)
WHERE year = 2015
group by continent
1 голос
/ 07 октября 2019

Вам не нужно писать 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
...