我在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
我能想到的只有光标,但还有更好的方法吗?
答案 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