sqlserver-sql:如何在select语句中返回20列,并且仅在单个列上具有唯一性



我有一个巨大的select语句,它有多个内部联接,可以返回20列信息。

是否有某种方法可以过滤结果,只基于单个列进行唯一(或不同)?

另一种思考方式是,当它进行联接时,它只获取单个ID上联接的第一个结果,然后停止并通过下一个ID进行联接。

我已经成功地使用了group bydistinct,但它们需要指定许多列,而不仅仅是一列,这似乎会将查询速度降低一个数量级。

更新

马丁·史密斯的回答非常有效。

当我更新查询以使用此技术时:

  • 它的速度增加了一倍多(1663ms降至740ms)
  • 它使用了较少的T-SQL代码(不需要向GROUP BY子句添加大量参数)
  • 它更易于维护

洞穴(非常小)

请注意,只有当您绝对确定将被删除的行总是重复的,或者此查询是不确定的(即,它可能会在不同的运行中返回不同的结果)时,才应该使用@Martin Smith的答案。

这不是GROUP BY问题,因为TSQL语法解析器将防止这种情况发生,也就是说,它只允许您在不可能出现重复的情况下返回结果。

您可以将row_number用于此

WITH T AS
(
SELECT ROW_NUMBER() OVER (PARTITION BY YourCol ORDER BY YourOtherCol) AS RN,
--Rest of your query here
)
SELECT *
FROM T
WHERE RN=1

最新更新