sql-server - SQL : How to bring back 20 columns in a select statement, 仅在单个列上具有唯一性?

标签 sql-server sql-server-2008 t-sql

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

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

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

我已经成功使用group bydistinct,但是这些要求您指定许多列,而不仅仅是一列,这似乎会减慢查询速度的数量级。

更新

@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/

相关文章:

visual-studio-2008 - 我应该先安装哪个 : Visual Studio 2008 or SQL Server 2008?

t-sql - 动态 T-SQL IIF 语句出现问题

mysql - 从其他表中加入最大值的最佳和最佳方式

c# - 优化100万到1000万条记录移动流程

vb.net - 如何在存储过程上构建 Crystal Report?

t-sql - tsql 格式为百分比

sql-server - 将 ISO 8601 持续时间转换为十进制时间 SQL 值,例如 PT7H30M 或 PT8H0M

c# - Linq 选择数据库中的对象存在字典键

sql - 如何对 SQL 表列进行验证?

sql-server - TSQL - 在事务语句中创建存储过程