row_nums没有使用row_number函数?

时间:2014-01-17 16:47:46

标签: sql sql-server

SELECT 
    *, (SELECT count(1) from color i WHERE i.NAME <= c.NAME)
FROM color c
ORDER BY name

输出:

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

我不明白这个查询如何在不使用row_number函数的情况下生成row_nums? 在订购之前或之后执行子查询时查询流程如何?

3 个答案:

答案 0 :(得分:5)

它是一个相关的子查询。对于c中的每一行,计算同一个表中具有相同名称或较低名称的行数。

这是一种生成行号的绝对低效且浪费的方式,但很可能是人们在SQL Server 2000中缺乏此类功能的最常见方式。当然,今天你应该使用:

SELECT id, name, ROW_NUMBER() OVER (ORDER BY name)
  FROM dbo.color
  ORDER BY name;

假设name是唯一的,你不需要打破关系。

答案 1 :(得分:2)

子选择

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

计算名称小于或等于外部select的当前行中的名称的行,从而计算直到该点的行。您可以通过在该表中使用两次颜色来混淆它。尝试再次插入红色,看看会发生什么

答案 2 :(得分:1)

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

相关问题