如何在SQL Server中使用DISTINCT来筛选多个列?

12

我有以下查询:

SELECT carBrand, carYear, carModel
FROM Cars;

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

我写了以下代码,但那并不是我想要的:

SELECT DISTINCT carBrand, carYear, carModel
FROM Cars;

我该如何解决这个问题?


在我的 SqlServer 中,“select DISTINCT carBrand, carYear, carModel from Cars;” 运行得非常完美。 - Gamby
我个人认为最好使用 OUTER APPLY,就像这样 - Muhammad Musavi
4个回答

18

DISTINCT 作用于整行记录,而不是特定的列。如果要获取唯一的名字,请只选择该列。

SELECT DISTINCT carBrand FROM Cars

18

尝试这个:

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

11

我不确定为什么被接受的答案被接受了,肯定也不理解为什么被点赞了,但是问题中有以下内容:

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

select DISTINCT carBrand, carYear, carModel from Cars;

被接受的答案建议使用:

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

该查询将返回与 OP 的查询完全相同的结果。实际上,答案中提出的建议(使用 group by)甚至不建议用于获取不同的结果,而应该用于聚合。有关更多信息,请参见答案。

此外,SQL Server 足够智能,能够理解如果查询中没有聚合函数,则查询实际上是在请求distinct,因此它会在底层使用distinct

如@MarkByers所示,distinct将对整个行进行去重。

想要测试上述内容的人,以下是一个将创建一个具有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。如果您使用聚合函数如SUM, COUNT等,则需要使用group by


3

这取决于你想要什么。比如,如果你想要的是“丰田卡罗拉”和“丰田凯美瑞”,但不考虑年份,那么你可以这样做:

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

不是要挑剔或者表现得很讨厌,因为我花费的时间并不多,但我确实一直认为只在单个列上获取“DISTINCT”非常简单,然而当我从“SELECT distinct id from tablename”中仅获得20条记录,而从“SELECT distinct id, pid from tablename”中却获得了数千条记录时,我偶然发现了这个页面。 - Tom Stickel
2
"SELECT distinct id, pid from table" 的翻译是 "select distinct(id,pid) from table",其中 distinct 关键字作为所有列名的组合。它有一对包裹所有列的秘密括号,可能会让人感到困惑。 - bh_earth0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接