Почему функция Max возвращает строки со значением 0 - PullRequest
0 голосов
/ 02 сентября 2018

Может кто-нибудь сказать мне, почему следующий запрос, кажется, возвращает строки с процентным значением 0, где они существуют.

SELECT cl.countrycode, c.name, c.continent, cl.language
FROM country c
JOIN countrylanguage cl ON cl.countrycode = c.code
WHERE Percentage = ANY (SELECT MAX(Percentage) FROM countrylanguage GROUP BY countrycode)

Я мог бы добавить '&& процент> 0' к запросу, чтобы отфильтровать их, но функция MAX должна фильтровать только максимальный процент для каждого кода страны?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Это ваш запрос:

SELECT cl.countrycode, c.name, c.continent, cl.language
FROM country c JOIN
     countrylanguage cl
     ON cl.countrycode = c.code
WHERE Percentage = ANY (SELECT MAX(Percentage)
                        FROM countrylanguage
                        GROUP BY countrycode
                       );

Подзапрос возвращает все проценты, которые являются максимальным значением для любой страны. В некоторых странах может быть строка, где 0 - максимальное значение. Вы можете выполнить запрос независимо, чтобы увидеть это.

Внешний запрос затем находит любой процент, который соответствует максимуму для любой страны. Это действительно не имеет смысла.

Максимум для каждой страны . Для этого используйте коррелированный подзапрос:

SELECT cl.countrycode, c.name, c.continent, cl.language
FROM country c JOIN
     countrylanguage cl
     ON cl.countrycode = c.code
WHERE cl.Percentage = (SELECT MAX(cl2.Percentage)
                       FROM countrylanguage cl2
                       WHERE cl2.countrycode = cl.countrycode
                      );

Разница в том, что подзапрос теперь содержит предложение WHERE, а не предложение GROUP BY, предписывающее, чтобы страны были одинаковыми.

0 голосов
/ 02 сентября 2018

попробуйте изменить, как это;

SELECT cl.countrycode, c.name, c.continent, cl.language
FROM country c
JOIN countrylanguage cl ON cl.countrycode = c.code
WHERE Percentage = (SELECT MAX(Percentage) FROM countrylanguage cl2 where cl2.countrycode=cl.countrycode)
...