在没有ROW_NUMBER函数的情况下计算行号。它是如何工作的?

时间:2015-12-05 10:17:38

标签: sql sql-server sql-server-2008 tsql

我刚刚遇到了一种没有ROW_NUMBER函数的行号:

SELECT name, sal, (SELECT COUNT(*)  FROM EMPLOYEE i WHERE o.name >= i.name) row_num
FROM EMPLOYEE o
order by row_num

有一些解释HERE 但我仍然不清楚这一点。

1 个答案:

答案 0 :(得分:3)

这是correlated subquery的例子:

SELECT name, sal, (SELECT COUNT(*)  FROM EMPLOYEE i WHERE o.name >= i.name) row_num
FROM EMPLOYEE o
order by row_num
  

可以通过执行子查询一次来评估许多查询   将结果值替换为WHERE子句   外部查询。在包含相关子查询的查询中(也是   称为重复子查询,子查询取决于外部   查询其值。这意味着执行了子查询   反复地,对于可能由外部选择的每一行一次   查询。

我们假设你有:

╔═══════╦═════╗
║ NAME  ║ SAL ║
╠═══════╬═════╣
║ Anno  ║  80 ║
║ Bhuti ║  60 ║
║ Darl  ║  80 ║
║ Hash  ║ 100 ║
╚═══════╩═════╝

对于外部查询中的Anno,子查询将仅返回

╔══════╦═════╗
║ NAME ║ SAL ║
╠══════╬═════╣
║ Anno ║  80 ║
╚══════╩═════╝

对于Bhuti,它将返回:

╔═══════╦═════╗
║ NAME  ║ SAL ║
╠═══════╬═════╣
║ Anno  ║  80 ║
║ Bhuti ║  60 ║
╚═══════╩═════╝

对于Darl,它将返回:

╔═══════╦═════╗
║ NAME  ║ SAL ║
╠═══════╬═════╣
║ Anno  ║  80 ║
║ Bhuti ║  60 ║
║ Darl  ║  80 ║
╚═══════╩═════╝

等等。 COUNT函数将获得行数。您还应该发现外部查询和子查询使用相同的表EMPLOYEE。别名oi用于区分它们。

您可以将 correlated subqueries 视为基于集合的环境中的循环方式。

修改

这相当于ROW_NUMBER函数的差。 Example from question

  

生成行号 - 这是一个正在运行的数字序列   使用纯SQL,每行都不容易。事实上,我正在采取的方法   以下显示也不是很通用。 此方法仅适用于   表格中至少有一个唯一的列。此方法将   如果没有单一的唯一列,但是集合也可以工作   列是唯一的。无论如何,这是查询: