Это действительно хороший вопрос. Я уже прочитал некоторые полезные ответы здесь, но, вероятно, я могу добавить более точное объяснение.
Сократить количество результатов запроса с помощью оператора GROUP BY легко, если вы не запрашиваете дополнительную информацию. Давайте предположим, что вы получили следующую таблицу 'location'.
--country-- --city--
France Lyon
Poland Krakow
France Paris
France Marseille
Italy Milano
Теперь запрос
SELECT country FROM locations
GROUP BY country
приведет к:
--country--
France
Poland
Italy
Тем не менее, следующий запрос
SELECT country, city FROM locations
GROUP BY country
... выдает ошибку в MS SQL, потому что как ваш компьютер может узнать, какой из трех французских городов "Лион", "Париж" или "Марсель" вы хотите прочитать в поле справа от "Франция"?
Чтобы исправить второй запрос, необходимо добавить эту информацию. Один из способов сделать это - использовать функции MAX () или MIN (), выбирая наибольшее или наименьшее значение среди всех кандидатов. MAX () и MIN () не только применимы к числовым значениям, но также сравнивают алфавитный порядок строковых значений.
SELECT country, MAX(city) FROM locations
GROUP BY country
приведет к:
--country-- --city--
France Paris
Poland Krakow
Italy Milano
или:
SELECT country, MIN(city) FROM locations
GROUP BY country
приведет к:
--country-- --city--
France Lyon
Poland Krakow
Italy Milano
Эти функции являются хорошим решением, если вы хорошо выбираете значение в любом конце алфавитного (или числового) порядка. Но что, если это не так? Предположим, вам нужно значение с определенной характеристикой, например, начинающееся с буквы «М». Теперь все усложняется.
Единственное решение, которое я смог найти, - это поместить весь ваш запрос в подзапрос и создать дополнительный столбец вне него руками:
SELECT
countrylist.*,
(SELECT TOP 1 city
FROM locations
WHERE
country = countrylist.country
AND city like 'M%'
)
FROM
(SELECT country FROM locations
GROUP BY country) countrylist
приведет к:
--country-- --city--
France Marseille
Poland NULL
Italy Milano
SELECT DISTINCT * FROM table
вас не работает?