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;
当前回答
这是一个非常好的问题。我已经在这里读到了一些有用的答案,但也许我可以补充一个更精确的解释。
只要不查询额外的信息,使用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
其他回答
这样只需要1个查询就可以得到2个唯一的列 select Distinct col1,col2 from '{path}' group by col1,col2 如果需要,可以增加列
SELECT DISTINCT FIELD1, FIELD2, FIELD3 FROM TABLE1,如果这三列的值在表中都是唯一的。
例如,如果您的名字有多个相同的值,但所选列中的姓和其他信息不同,则该记录将包含在结果集中。
从您的问题措辞中,我了解到您希望为给定字段选择不同的值,并为每个这样的值列出同一行中的所有其他列值。大多数dbms不允许使用DISTINCT或GROUP BY,因为结果是不确定的。
可以这样想:如果field1出现了不止一次,那么将列出field2的值(假设在两行中field1的值相同,但在这两行中field2的值不同)。
然而,你可以使用聚合函数(显式地为你想要显示的每个字段),并使用GROUP BY而不是DISTINCT:
SELECT field1, MAX(field2), COUNT(field3), SUM(field4), ....
FROM table GROUP BY field1
如果我没理解错的话,你的问题和我刚才遇到的问题很相似。您希望能够将DISTINCT的可用性限制在指定的字段,而不是将其应用于所有数据。
如果你使用GROUP BY而没有聚合函数,你GROUP BY的字段将是你的DISTINCT字段。
如果你有疑问:
SELECT * from table GROUP BY field1;
它将显示基于field1的单个实例的所有结果。
例如,如果您有一个包含名称、地址和城市的表。一个人有多个地址记录,但你只想要这个人的一个地址,你可以这样查询:
SELECT * FROM persons GROUP BY name;
结果将是该名称的一个实例及其地址将出现,而另一个实例将从结果表中被省略。注意:如果你的字段有原子值,如firstName, lastName,你想要分组。
SELECT * FROM persons GROUP BY lastName, firstName;
因为如果两个人有相同的姓氏,而你只按姓氏分组,那么其中一个人将从结果中被忽略。你需要考虑到这些事情。希望这能有所帮助。
我建议使用
SELECT * from table where field1 in
(
select distinct field1 from table
)
这样,如果field1在多个行中有相同的值,将返回所有记录。