首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否可以替代ROW_NUMBER()来获取行位置?

是否可以替代ROW_NUMBER()来获取行位置?
EN

Stack Overflow用户
提问于 2018-05-31 15:42:42
回答 2查看 2.3K关注 0票数 2

我有一个动态生成的查询,其中可能包含一个复杂的ORDER BY子句。我需要将行号检索到一个列中,以便进一步处理。我所能找到的所有文档都指向ROW_NUMBER(),但是-unless我遗漏了一些东西-我需要重写查询以将ORDER BY子句从下面移出:

代码语言:javascript
复制
SELECT ...
FROM ...
JOIN ...
WHERE ...
ORDER BY ...

..。要这样做:

代码语言:javascript
复制
SELECT ..., ROW_NUMBER() OVER(ORDER BY ...) AS RN
FROM ...
JOIN ...
WHERE ...

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-31 16:00:58

我看到人们使用的另一种方法是:

代码语言:javascript
复制
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(),因为它总体上是更好的选择。

票数 1
EN

Stack Overflow用户

发布于 2018-05-31 16:02:16

你可以这样做:

代码语言:javascript
复制
select  *, row_number() over(order by (select null))
from    MyTable
order by Col1

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

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

如果你对性能有顾虑,你应该针对你的情况做一些测试,如果有问题,就发布另一个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50619177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档