Sql 使用union运算符为select语句的行编号

Sql 使用union运算符为select语句的行编号,sql,sql-server,select,union,row-number,Sql,Sql Server,Select,Union,Row Number,SQL SERVER:如何使用union运算符枚举select语句的行,但不重新启动计数、不重复和不使用subselect?可能吗?我需要有性能的东西。我用subselect和函数ROW_NUMBER()得到了它,但我需要更快的东西。有什么想法吗?谢谢 这是我能想到的最快的: select t.*, row_number() over (order by (select NULL)) as seqnum from ((select * from A) union all (selec

SQL SERVER:如何使用union运算符枚举select语句的行,但不重新启动计数、不重复和不使用subselect?可能吗?我需要有性能的东西。我用subselect和函数ROW_NUMBER()得到了它,但我需要更快的东西。有什么想法吗?谢谢

这是我能想到的最快的:

select t.*, row_number() over (order by (select NULL)) as seqnum
from ((select * from A) union all
      (select * from B)
     ) t;
两件事。首先,它使用
union all
而不是
union
——因此不会删除重复项。如果不需要删除重复项,则可以加快查询速度


其次,它使用
orderby(selectnull))
。根据我的经验,这似乎在输出上分配了一个序列号,而实际上没有产生排序的开销。这完全是基于我的经验。我还没有找到解释这一点的SQL Server文档。但是,我过去成功地使用过它。

如果您使用的是SQL Server 2012+,您可以尝试以下方法:

DECLARE @T TABLE (col1 INT, col2 INT);

INSERT INTO @T
VALUES (1, 2), (3, 4), (5, 6);

SELECT COUNT(*) OVER (
        ORDER BY col1 ROWS UNBOUNDED PRECEDING
        ) RN, col1, col2
FROM @T

不清楚。你能提供测试数据和预期结果吗?查询需要多长时间?你对“足够快”的定义是什么?您检查过查询计划并确保它没有丢失索引吗?哇
排序依据(选择NULL)
--太棒了!将“选择空”按works排序!select几乎立即返回。之前,大约需要4秒钟。非常感谢。为什么要使用count而不是row_number?我投票赞成“按col1行无边界前序求和(1)”:-)