我有以下查询:
SELECT carBrand, carYear, carModel
FROM Cars;
我想要的是获取不同的汽车名称。
我写了以下代码,但那并不是我想要的:
SELECT DISTINCT carBrand, carYear, carModel
FROM Cars;
我该如何解决这个问题?
我有以下查询:
SELECT carBrand, carYear, carModel
FROM Cars;
我想要的是获取不同的汽车名称。
我写了以下代码,但那并不是我想要的:
SELECT DISTINCT carBrand, carYear, carModel
FROM Cars;
我该如何解决这个问题?
DISTINCT 作用于整行记录,而不是特定的列。如果要获取唯一的名字,请只选择该列。
SELECT DISTINCT carBrand FROM Cars
尝试这个:
SELECT carBrand, carYear, carModel
FROM Cars
GROUP BY carBrand, carYear, carModel;
我不确定为什么被接受的答案被接受了,肯定也不理解为什么被点赞了,但是问题中有以下内容:
我写了这个,但这不是我想要的。
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列数据并填充数据的表的脚本。无论是(distinct
和group 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
。
这取决于你想要什么。比如,如果你想要的是“丰田卡罗拉”和“丰田凯美瑞”,但不考虑年份,那么你可以这样做:
SELECT DISTINCT carBrand + ' ' + carModel AS carName
FROM Cars;
OUTER APPLY
,就像这样。 - Muhammad Musavi