それは本当に良い質問です。私はすでにここでいくつかの役立つ回答を読みましたが、おそらくもっと正確な説明を追加できます。
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でエラーをスローします。コンピュータがフランスの3つの都市「リヨン」、「パリ」、「マルセイユ」のどれを「フランス」の右側のフィールドで読みたいのかをどのようにして知ることができるのでしょうか。
2番目のクエリを修正するには、この情報を追加する必要があります。これを行う1つの方法は、関数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
これらの関数は、アルファベット順(または数値順)の両端から値を選択することに問題がない限り、適切なソリューションです。しかし、そうでない場合はどうでしょうか?たとえば、文字「M」で始まる特定の特性を持つ値が必要であると仮定します。今、物事は複雑になります。
これまでに見つけた唯一の解決策は、クエリ全体をサブクエリに入れ、その外に手動で追加の列を作成することです。
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
ですか?