SELECT DISTINCT field1, field2, field3, ......
FROM table;
我试图完成以下SQL语句,但我希望它返回所有列。 这可能吗?
就像这样:
SELECT DISTINCT field1, *
FROM table;
SELECT DISTINCT field1, field2, field3, ......
FROM table;
我试图完成以下SQL语句,但我希望它返回所有列。 这可能吗?
就像这样:
SELECT DISTINCT field1, *
FROM table;
当前回答
好问题@aryaxt——你可以看出这是一个好问题,因为你5年前问过这个问题,而我今天在试图找到答案时偶然发现了它!
我只是试图编辑接受的答案,以包括这一点,但如果我的编辑没有使它:
如果你的表不是那么大,并且假设你的主键是一个自动递增的整数,你可以这样做:
SELECT
table.*
FROM table
--be able to take out dupes later
LEFT JOIN (
SELECT field, MAX(id) as id
FROM table
GROUP BY field
) as noDupes on noDupes.id = table.id
WHERE
//this will result in only the last instance being seen
noDupes.id is not NULL
其他回答
只需将所有字段包含在GROUP BY子句中。
SELECT c2.field1 ,
field2
FROM (SELECT DISTINCT
field1
FROM dbo.TABLE AS C
) AS c1
JOIN dbo.TABLE AS c2 ON c1.field1 = c2.field1
SELECT *
FROM tblname
GROUP BY duplicate_values
ORDER BY ex.VISITED_ON DESC
LIMIT 0 , 30
在ORDER BY我刚刚把例子放在这里,你也可以在这里添加ID字段
这是一个非常好的问题。我已经在这里读到了一些有用的答案,但也许我可以补充一个更精确的解释。
只要不查询额外的信息,使用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
or:
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
好问题@aryaxt——你可以看出这是一个好问题,因为你5年前问过这个问题,而我今天在试图找到答案时偶然发现了它!
我只是试图编辑接受的答案,以包括这一点,但如果我的编辑没有使它:
如果你的表不是那么大,并且假设你的主键是一个自动递增的整数,你可以这样做:
SELECT
table.*
FROM table
--be able to take out dupes later
LEFT JOIN (
SELECT field, MAX(id) as id
FROM table
GROUP BY field
) as noDupes on noDupes.id = table.id
WHERE
//this will result in only the last instance being seen
noDupes.id is not NULL