我有一个巨大的 select 语句,具有多个内部联接,可返回 20 列信息。
是否有某种方法可以过滤结果以仅基于单个列进行唯一(或不同)?
另一种思考方式是,当它进行连接时,它仅获取单个 ID 上连接的第一个结果,然后停止并移动到下一个 ID 的连接。
我已经成功使用group by
和distinct
,但是这些要求您指定许多列,而不仅仅是一列,这似乎会减慢查询速度的数量级。
更新
@Martin Smith 的回答非常有效。
当我更新查询以使用此技术时:
- 速度提高了一倍多(1663 毫秒降至 740 毫秒)
- 它使用了更少的 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
关于sql-server - SQL : How to bring back 20 columns in a select statement, 仅在单个列上具有唯一性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31170886/