当我在 SQL Server 中有多个列时如何使用 DISTINCT?

新手上路,请多包涵

我有以下查询:

 SELECT carBrand, carYear, carModel
FROM Cars;

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

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

 SELECT DISTINCT carBrand, carYear, carModel
FROM Cars;

我怎么解决这个问题?

原文由 EmreAltun 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 454
2 个回答

试试这个:

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

原文由 Yahia 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

 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 。使用 group by 时使用聚合函数,例如 SUMCOUNT 等。

原文由 CodingYoshi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进