在这些开始和结束字段之间生成数字

时间:2010-07-20 05:45:50

标签: sql-server tsql

我在TSQL中有3列(ID,开始和结束)。

ID; Start; END
1; 1; 5;
2; 10; 15;

所以它会产生如下数字:

1, 1
1, 2
1, 3
1, 4
1, 5
2, 10
2, 11
2, 12
2, 13
2, 14
2, 15

我能想到的只有光标,但还有更好的方法吗?

2 个答案:

答案 0 :(得分:4)

像这样(未经测试)

;WITH cNumbers AS
(
   SELECT
       ROW_NUMBER() OVER (ORDER BY c1.object_id) AS ArbitraryNumber
   FROM
       sys.columns c1 CROSS JOIN sys.columns c2
)
SELECT
    M.ID, N.ArbritraryNumber
FROM
    MyTable M
    JOIN
    cNumbers N ON N.ArbitraryNumber BETWEEN M.Start AND M.End

编辑:

交叉连接在我的tempdb中提供了298,116行。用户数据库中有1,865,956。 如果接近300k是不够的,请添加另一个CROSS JOIN。

这给了我tempdb中的162,771,336和用户数据库中的2,548,895,896:

SELECT
    COUNT_BIG(*) --note bigint
FROM
    sys.columns c1 CROSS JOIN sys.columns c2 CROSS JOIN sys.columns c3

答案 1 :(得分:2)

CTE方法很容易

with tab as(
select 1 as id, 1 as start, 5 as en
union all
select 2, 10, 15),
 cte as(
select id,start,en from tab
union all
select id,start+1 , en from cte where start+1<=en)
select id,start from cte
order by id