我有一个表,其行的开头和结尾编号是一个范围,例如
key startID endID
1 500 505
2 784 788
3 802 804
依旧......
我想创建一个临时表(或表变量/ cte等),每个数字都有一行,它们在它们之间覆盖范围 - 即给出上面的例子,我希望看到一个包含以下行:
ID
500
501
502
503
504
505
784
785
786
787
788
802
803
804
有人能指出我快速简便的方法来实现这一目标吗?我想过以某种方式使用数字表,但我正在看的表有> 200米行,我没有那么大的数字表!
非常感谢任何帮助。提前谢谢。
答案 0 :(得分:12)
WITH q AS
(
SELECT startId, endId
FROM ranges
UNION ALL
SELECT startId + 1, endId
FROM q
WHERE startId < endId
)
SELECT startId
FROM q
OPTION (MAXRECURSION 0)
答案 1 :(得分:4)
在MSSQL中,您也可以使用任意大型表中的select,syscolumns就是一个例子。如果没有足够的行 - 您可以进行交叉连接:
SELECT TOP 10000
ROW_NUMBER() OVER (ORDER BY c1.id)
FROM syscolumns AS c1
CROSS JOIN syscolumns AS c2