【问题标题】:Add a row number to result set of a SQL query将行号添加到 SQL 查询的结果集中
【发布时间】:2013-12-12 12:21:17
【问题描述】:

我有一个简单的选择语句。我想添加一个临时列,它将对我的结果集中的行进行编号。我试过这个 -

declare @num int
set @num = 0;
select t.A, t.B, t.C, (@count + 1) as number
from tableZ as t

它将 1 分配给所有行。我尝试了@count = @count + 1,但它没有用。 我如何以简单的方式做这件事?

谢谢。

【问题讨论】:

  • 您希望行号如何增加?随意的?您的查询没有 ORDER BY,因此,您需要定义您期望的顺序。
  • @AaronBertrand - 我只需要对我的行进行编号。订单并不是真正需要的。这能回答你的问题吗?
  • 所以您可以接受随机应用的顺序,并且每次都以不一致的顺序向您的查询吐出结果?

标签: sql sql-server sql-server-2005


【解决方案1】:
SELECT
    t.A,
    t.B,
    t.C,
    ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS number
FROM tableZ AS t

查看工作示例at SQLFiddle

当然,您可能想要定义行编号顺序 - 如果是这样,只需将 OVER (ORDER BY (SELECT 1)) 交换为,例如,OVER (ORDER BY t.C),就像在普通的 ORDER BY 子句中一样。

【讨论】:

  • 为什么添加 where number = 1 或其他基于 number 的 where 子句会引发无效列错误?有什么方法可以根据number 列添加where 子句?
  • @CJEdgerton 因为 SELECT 语句的解析/读取方式。 WHERE 子句是在 SELECT 列表中的别名具体化之前计算的。因此,要解决这个问题,您只需将 SELECT 放在 CTE/子查询中,然后在从中选择时使用 where 子句。
【解决方案2】:

典型的模式如下,但您需要实际定义应如何应用排序(因为根据定义,表是一个无序的行包)。如果您不关心特定顺序,那么一种方法是使用覆盖索引的前导键、聚集索引的前导键或任何 group by / order 中的列通过条款。在这种情况下,我假设 At 的单列聚类键:

SELECT t.A, t.B, t.C, number = ROW_NUMBER() OVER (ORDER BY t.A)
  FROM dbo.tableZ AS t
  ORDER BY t.A;

如果您真的不关心顺序,您可以使用以下命令生成任意/不确定的行编号:

ROW_NUMBER() OVER (ORDER BY @@SPID)

-- or for serial plans

ROW_NUMBER() OVER (ORDER BY @@TRANCOUNT)

我从 Paul White in this article 那里学到的小技巧(参见“Paul 的解决方案”)。

不确定您问题中的变量应该代表什么(它们不匹配)。

猜你喜欢
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多