SQL:如何在select语句中返回20列,仅在一列上具有唯一性?

Con*_*ngo 2 t-sql sql-server sql-server-2008

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

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

另一种思考方式是,当它进行连接时,它只在单个ID上获取连接的第一个结果,然后它停止并移动到下一个ID的连接.

我已经成功地使用group bydistinct,但这些都需要你指定多列,不只是一列,从而出现了一个数量级,以减缓下来查询.

更新

@Martin Smith的答案非常有效.

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

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

警告(非常小)

请注意,如果您完全确定要删除的行将始终是重复的,那么您应该只使用@Martin Smith的答案,否则此查询将是非确定性的(即它可能会从运行中带回不同的结果) ).

不是问题GROUP BY,因为TSQL语法分析器会阻止它发生,即它只会让你在没有重复的可能性的情况下恢复结果.

Mar*_*ith 5

你可以用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
Run Code Online (Sandbox Code Playgroud)