我有一个动态生成的查询,其中包含一个可能很复杂的ORDER BY
子句。我需要将行号检索到列中以进行进一步处理。我能够找到的所有文档都指向ROW_NUMBER()
,但是 - 我没有丢失一些东西 - 我需要重写查询以从中移动ORDER BY
子句:< / p>
SELECT ...
FROM ...
JOIN ...
WHERE ...
ORDER BY ...
......对此:
SELECT ..., ROW_NUMBER() OVER(ORDER BY ...) AS RN
FROM ...
JOIN ...
WHERE ...
我当然可以这样做,但它涉及调整一些由其他不需要此模块共享的复杂代码。
是否有一个函数变量只检索当前结果集中的行位置?
答案 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伪列。)