当我在sql server中有多个列时如何使用DISTINCT

时间:2012-04-08 20:19:45

标签: sql sql-server distinct

我有以下查询:

select carBrand, carYear, carModel from cars;

我想要的只是获得不同的汽车名称。

我写了这个,但这不是我想要的。

select DISTINCT carBrand, carYear, carModel from Cars;

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:17)

DISTINCT适用于整行,而不是特定列。如果要获取唯一名称,请仅选择该列。

SELECT DISTINCT carBrand FROM Cars

答案 1 :(得分:17)

SELECT carBrand , carYear ,carModel 
FROM Cars 
GROUP BY carBrand , carYear ,carModel;

答案 2 :(得分:7)

我不确定为什么接受的答案已经被接受,当然不明白为什么它被投票,但OP在问题中有以下内容:

  

我写了这个,但这不是我想要的。

select DISTINCT carBrand, carYear, carModel from Cars;

接受的答案建议使用:

SELECT carBrand , carYear ,carModel 
FROM Cars 
GROUP BY carBrand , carYear ,carModel;

返回与OP查询完全相同的结果。实际上,答案中的建议(使用分组)甚至不被鼓励用于获得不同的结果,但应该用于聚合。有关详细信息,请参阅this答案。

此外,SQL Server足够聪明,可以理解如果查询中没有聚合函数,那么查询实际上是在询问distinct,因此它将使用distinct。< / p> 正如@MarkByers在答案中指出的那样,明显将在整行上做出明显的决定。

对于那些想要测试上述内容的人来说,这是一个脚本,它将创建一个包含3列的表,然后用数据填充它。两者(distinctgroup by)都将返回相同的结果集。

CREATE TABLE [dbo].[Cars](
    [carBrand] [varchar](50) NULL,
    [carYear] [int] NULL,
    [carModel] [varchar](50) NULL
)
go;
insert into Cars values('BMW', 2000, '328 i');
insert into Cars values('BMW', 2000, '328 i');
insert into Cars values('BMW', 2000, '328 i');
insert into Cars values('BMW', 2000, '3M');

两个查询都会返回此结果:

carBrand    carYear    carModel
BMW         2000       328 i
BMW         2000       3M

<强>结论

如果您需要不同的记录,请不要使用group by。使用distinct。使用group bySUM等聚合函数时使用COUNT

答案 3 :(得分:3)

这取决于你想要什么。例如,如果你想要'丰田卡罗拉'和'丰田凯美瑞',但忽略了这一年,那么你可以这样做:

SELECT DISTINCT carBrand + ' ' + carModel AS carName
FROM Cars;