我有一个动态生成的查询,其中可能包含一个复杂的ORDER BY
子句。我需要将行号检索到一个列中,以便进一步处理。我所能找到的所有文档都指向ROW_NUMBER()
,但是-unless我遗漏了一些东西-我需要重写查询以将ORDER BY
子句从下面移出:
SELECT ...
FROM ...
JOIN ...
WHERE ...
ORDER BY ...
..。要这样做:
SELECT ..., ROW_NUMBER() OVER(ORDER BY ...) AS RN
FROM ...
JOIN ...
WHERE ...
我当然可以做到这一点,但它涉及到调整一些复杂的代码,这些代码是由其他不需要的模块共享的。
是否有一个函数变量可以只检索当前结果集中的行位置?
发布于 2018-05-31 16:00:58
我看到人们使用的另一种方法是:
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
实际上就是我们要找的。但是,不确定这样做是否会获得更好的性能。要看你的案子了。如果需要,可以用表变量替换临时表,也可以使用idx
上的PRIMARY KEY
。
一般来说,我总是选择ROW_NUMBER()
,因为它总体上是更好的选择。
发布于 2018-05-31 16:02:16
你可以这样做:
select *, row_number() over(order by (select null))
from MyTable
order by Col1
OVER
子句中的ORDER BY
与查询的ORDER BY
子句是分开的。
order by (select null)
解决了必须为row_number()函数提供一个排序列的问题。
如果你对性能有顾虑,你应该针对你的情况做一些测试,如果有问题,就发布另一个问题。
https://stackoverflow.com/questions/50619177
复制相似问题