логика использования временной таблицы вместо группировки в подзапросе - PullRequest
0 голосов
/ 18 октября 2019

В моей стране таблицы:

name|gdp|city
-------------
S.A |60 |amr
S.A |60 |amb
US  |200|ken
US  |70 |mas
aus |80 |po
aus |90 |tr

Я хочу получить страну, чей ВВП меньше 100. Когда я использую (2), он не работает и выдает ошибку, потому что возвращает несколько значений, которые должнысравните с условием условия. Когда я использую (1), он работает, хотя подзапрос по-прежнему возвращает несколько значений, которые сравниваются со значением 100. Какова логика, лежащая в основе этого, пожалуйста, объясните, потому что я новичок в sql. Чем подзапрос в (1) отличается от (2)

  • (1)
    SELECT DISTINCT
           name
    FROM country a
    WHERE 100 > (SELECT SUM(gdp)FROM country b WHERE a.name = b.name);
  • (2)
    SELECT DISTINCT
           name
    FROM country a
    WHERE 100 > (SELECT SUM(gdp)FROM country b GROUP BY name);

Подзапрос возвратил более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Ответы [ 3 ]

0 голосов
/ 18 октября 2019

Похоже, что вы после HAVING здесь:

CREATE TABLE dbo.Country ([name] varchar(3),
                          gdp smallint,
                          city varchar(3));
INSERT INTO dbo.Country (name,
                         gdp,
                         city)
VALUES ('S.A', 60, 'amr'),
       ('S.A', 60, 'amb'),
       ('US ', 200, 'ken'),
       ('US ', 70, 'mas'),
       ('aus', 80, 'po '),
       ('aus', 90, 'tr ');
GO

SELECT C.name
FROM dbo.Country C
GROUP BY C.name
HAVING SUM(C.gdp) < 100 

GO

DROP TABLE dbo.Country;

Если вы хотите строки, где "ВВП страны меньше 100", это не возвращает строк, так как нет стран, гдеSUM из gdp на ниже , чем 100. (S.A имеет 120, US имеет 270, а aus имеет 170).

Если gbp в стране (не в городе) работает по-разному, вам может понадобиться использовать другую функцию агрегирования (AVG, MAX?) Или совершенно другой метод,если это так, вы должны объяснить какие строки вы ожидаете в своем вопросе и почему .

0 голосов
/ 18 октября 2019

Подзапрос в запросе номер 1 не возвращает несколько значений. То, что у вас есть, называется «коррелированный подзапрос». Подзапрос имеет предложение WHERE, которое связывает результаты подзапроса («внутренний» запрос) с основным запросом («внешний» запрос). Это бит WHERE a.name = b.name. Функционально этот запрос выполняется построчно, где совпадают значения name, а подзапрос возвращает только один результат для этого значения name. Вы заметите, что вы не можете запустить подзапрос сам по себе, потому что для работы ему нужно получить значение name из внешнего запроса.

В запросе № 2, если вы запуститеподзапрос сам по себе возвращает список суммированных gdp значений. Один столбец, с несколькими рядами. Предложение GROUP BY сообщает запросу SUM результаты по name, но набор результатов не содержит значения name, так что это просто список чисел. Внешний запрос не может узнать , какую строку этого набора результатов вы хотите сравнить с 100, и поэтому он выдает ошибку, которую вы получили.

0 голосов
/ 18 октября 2019

Когда вы используете (2): вы получаете несколько значений в подзапросе, так как у вас нет условия WHERE. Вы получаете несколько стран и соответствующую сумму. Итак, вы получаете сообщение об ошибке.

Когда вы используете (1): вы получаете одно значение в подзапросе, так как вы получаете один ВВП, когда применяете фильтр на уровне страны. Для каждой страны вы получаете только одну сумму. Итак, вы не получаете ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...