Це справді гарне запитання. Тут я вже прочитав кілька корисних відповідей, але, напевно, можу додати більш точне пояснення.
Зменшити кількість результатів запитів за допомогою оператора GROUP BY легко, якщо ви не запитуєте додаткову інформацію. Припустимо, ви отримали таку таблицю "Розташування".
--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
працює для вас?