Sql 行数不使用行数函数?

Sql 行数不使用行数函数?,sql,sql-server,Sql,Sql Server,我不明白这个查询如何在不使用row\u number函数的情况下生成row\u nums? 当子查询在order by之前或之后执行时,查询流将如何?它使用相关子查询来计算其上方的行数。请注意,对于大型数据集,此查询的性能远远低于使用ROW_NUMBER(),后者使用定点逻辑来确定其位置,而不是运行每行的计数。子选择 id NAME ----------- ------------------------- ----------- 4

我不明白这个查询如何在不使用row\u number函数的情况下生成row\u nums?
当子查询在order by之前或之后执行时,查询流将如何?

它使用相关子查询来计算其上方的行数。请注意,对于大型数据集,此查询的性能远远低于使用ROW_NUMBER(),后者使用定点逻辑来确定其位置,而不是运行每行的计数。

子选择

id          NAME                      
----------- ------------------------- -----------
4           blue                      1
1           orange                    2
3           red                       3
2           yellow                    4

从color i中选择count(1),其中i.name是一个相关子查询。对于
c
中的每一行,计算同一表格中具有相同名称或更低名称的行数

这是一种绝对低效且浪费的生成行号的方法,但可能是人们在SQLServer2000中解决缺少此类功能问题的最常见方法。当然,今天您应该使用:

select count(1) from color i where i.name <= c.name)

假设
name
是唯一的,你不需要断绝关系。

FYI:“Performant”是一个名词,一个能干的人。@swasheck:这似乎不是一般的理解-为什么不使用一个表达相同意思的词(比如
efficient
)而不引起任何争议呢(或让人们把头撞在桌子上)这就像使用而不是使用,或者无数而不是很多,只是performant仍然不在字典中。关键是,当你选择使用这个词时,很多人认为它不是一个词,他们可能会对你不那么重视。在这里,谁在乎呢;在商业环境中,要小心。IMHO。@PinnyM这是我在whic中看到的链接h注意到它是一个名词。“performant”根本不在字典中。@swasheck-牛津字典是一个可接受的资源吗?我如何打破联系?@RegisteredUser-不管你怎么想:)向ORDER BY子句添加一个id是一种常用的方法。@RegisteredUser这取决于你的意思,因为联系可以有多种多样。如果名称不唯一,则可以在名称后选择另一列进行排序,例如,
OVER(orderbyname,id)
将给出
4,蓝色
的行号为1,而
6,蓝色
的行号为2。
select count(1) from color i where i.name <= c.name)
SELECT id, name, ROW_NUMBER() OVER (ORDER BY name)
  FROM dbo.color
  ORDER BY name;