Emr*_*tun 10 sql sql-server distinct
我有以下查询:
select carBrand, carYear, carModel from cars;
Run Code Online (Sandbox Code Playgroud)
我想要的只是获得不同的汽车名称.
我写了这个,但这不是我想要的.
select DISTINCT carBrand, carYear, carModel from Cars;
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?
Mar*_*ers 17
DISTINCT适用于整行,而不是特定列.如果要获取唯一名称,请仅选择该列.
SELECT DISTINCT carBrand FROM Cars
Run Code Online (Sandbox Code Playgroud)
Yah*_*hia 17
尝试
SELECT carBrand , carYear ,carModel
FROM Cars
GROUP BY carBrand , carYear ,carModel;
Run Code Online (Sandbox Code Playgroud)
我不确定为什么接受的答案已被接受,当然不明白为什么它被赞成,但OP在问题中有以下内容:
我写了这个,但这不是我想要的.
select DISTINCT carBrand, carYear, carModel from Cars;
Run Code Online (Sandbox Code Playgroud)
接受的答案建议使用:
SELECT carBrand , carYear ,carModel
FROM Cars
GROUP BY carBrand , carYear ,carModel;
Run Code Online (Sandbox Code Playgroud)
返回与OP查询完全相同的结果.实际上,答案中的建议(使用分组)甚至不被鼓励用于获得不同的结果,但应该用于聚合.有关详细信息,请参阅此答案.
此外,SQL Server足够聪明,可以理解,如果查询中没有聚合函数,那么查询实际上是要求distinct它,因此它将distinct在底层使用.
正如@MarkByers在答案中指出的那样,区别在整个行上都会有所不同.
对于那些想要测试上述内容的人来说,这是一个脚本,它将创建一个包含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');
Run Code Online (Sandbox Code Playgroud)
两个查询都将返回此结果:
carBrand carYear carModel
BMW 2000 328 i
BMW 2000 3M
Run Code Online (Sandbox Code Playgroud)
结论
group by如果您想要不同的记录,请不要使用.使用distinct.使用group by当您使用聚合函数,例如SUM,COUNT等等.