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