使用union运算符对select语句的行进行编号

时间:2013-09-19 19:11:20

标签: sql sql-server select union row-number

SQL SERVER:如何使用union运算符枚举select语句的行,但是没有重新启动计数,没有双重性且没有subselect?可能吗?我需要有表现力的东西。我用subselect和函数ROW_NUMBER()得到它,但我需要更快的东西。任何的想法?谢谢!

2 个答案:

答案 0 :(得分:2)

这是我能想到的最快的:

select t.*, row_number() over (order by (select NULL)) as seqnum
from ((select * from A) union all
      (select * from B)
     ) t;

两件事。首先,它使用union all而不是union - 因此不会删除重复项。如果不需要重复删除,这会加快查询速度。

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

答案 1 :(得分:1)

如果您使用的是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