1

SQL SERVER:如何使用联合运算符枚举 select 语句的行,但不重新开始计数、不重复和不选择子选择?可能吗?我需要有性能的东西。我用 subselect 和函数 ROW_NUMBER() 得到了它,但我需要更快的东西。任何想法?谢谢!

4

2 回答 2

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 文档。但是,我过去成功地使用过它。

于 2013-09-19T19:21:56.950 回答
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
于 2013-09-19T19:26:05.470 回答