替代ROW_NUMBER()获取行位置?

时间:2018-05-31 07:42:42

标签: sql-server sql-server-2008

我有一个动态生成的查询,其中包含一个可能很复杂的ORDER BY子句。我需要将行号检索到列中以进行进一步处理。我能够找到的所有文档都指向ROW_NUMBER(),但是 - 我没有丢失一些东西 - 我需要重写查询以从中移动ORDER BY子句:< / p>

SELECT ...
FROM ...
JOIN ...
WHERE ...
ORDER BY ...

......对此:

SELECT ..., ROW_NUMBER() OVER(ORDER BY ...) AS RN
FROM ...
JOIN ...
WHERE ...

我当然可以这样做,但它涉及调整一些由其他不需要此模块共享的复杂代码。

是否有一个函数变量只检索当前结果集中的行位置?

3 个答案:

答案 0 :(得分:1)

我见过人们使用的另一种方法如下:

IF (OBJECT_ID('tempdb..#tempresult') IS NOT NULL)
    DROP TABLE #tempresult;
CREATE TABLE #tempresult (
    idx INT IDENTITY(1,1), 
    ...
);

INSERT #tempresult ...
SELECT ...
FROM ...
JOIN ...
WHERE ...
ORDER BY ...

idx实际上就是我们所寻求的。 但是,不确定这是否会更加性能最佳。取决于你的情况。 如有必要,可以使用表变量替换临时表,也可以使用PRIMARY KEY上的idx

一般来说,我总是选择ROW_NUMBER(),因为总体来说这是更好的选择。

答案 1 :(得分:1)

你可以这样做:

select  *, row_number() over(order by (select null))
from    MyTable
order by Col1

ORDER BY子句中的OVER与查询的ORDER BY子句分开。

order by (select null)解决了必须提供用于排序row_number()函数的列的问题。

如果您对性能有疑虑,应该针对您的情况进行一些测试,并在出现问题时发布其他问题。

答案 2 :(得分:0)

对于记录,在编写本文时,似乎没有在SQL Server中实现此精确功能,即使在最新版本中也是如此。您需要使用其他技术,如ROW_NUMBER()或在接受的答案中解释的临时表技巧。

(例如,Oracle有ROWNUM伪列。)