我刚刚遇到了一种没有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 但我仍然不清楚这一点。
答案 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
。别名o
和i
用于区分它们。
您可以将 correlated subqueries
视为基于集合的环境中的循环方式。
修改强>
这相当于ROW_NUMBER
函数的差。 Example from question
:
生成行号 - 这是一个正在运行的数字序列 使用纯SQL,每行都不容易。事实上,我正在采取的方法 以下显示也不是很通用。 此方法仅适用于 表格中至少有一个唯一的列。此方法将 如果没有单一的唯一列,但是集合也可以工作 列是唯一的。无论如何,这是查询: