这是一个非常好的问题。我已经在这里阅读了一些有用的答案,但是也许我可以添加更精确的解释。
只要不查询其他信息,使用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
只要您可以从字母(或数字)顺序的两端选择值,这些函数就是一个很好的解决方案。但是,如果不是这种情况怎么办?让我们假设您需要一个具有特定特征的值,例如以字母“ 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
对您不起作用?