我无法解释我的问题,但是我有这张桌子
ID START END
1 10 12
2 30 31
3 11 13
并想要这样的东西:
ID NUMber
1 10
1 11
1 12
2 30
2 31
3 11
3 12
3 13
我需要将两列之间的所有唯一整数转换为单独的行。
这就是我想要的转换外观
我什么都没尝试过,因为我什至都不知道如何调用这样的程序,所以可以得到任何帮助
如果您没有数字表(强烈建议使用),则可以将临时计数表与CROSS APPLY
配合使用
示例
Select A.ID,B.Number
From YourTable A
Cross Apply ( Select Top ([End]-[Start]+1)
Number=[START]-1+Row_Number() Over (Order By (Select NULL))
From master..spt_values n1,master..spt_values n2
) B
返回
ID Number
1 10
1 11
1 12
2 30
2 31
3 11
3 12
3 13
,
在SQL Server中,您可以使用递归CTE:
with cte as (
select id,[start] as number,[end] as end_number
from t
union all
select id,number + 1
from cte
where number < end_number
)
select id,number
from cte;
注意:如果跨度可以超过100,则需要option (maxrecursion)
进行查询。
递归CTE通常比数字表慢一点。但是,我发现它们的速度比我预期的快得多。
,
--create table NewTable --( --ID int,--NUMBER int --)DECLARE @ID nvarchar(50) declare @START int declare @END int
DECLARE Cursor_Name CURSOR FOR select ID,[START],[End] from tblSequences OPEN Cursor_Name
FETCH NEXT FROM Cursor_Name INTO @ID,@START,@END WHILE @@FETCH_STATUS = 0 beginWHILE @START<=@END begin insert into NewTable (ID,NUMBER) Values (@ID,@START) set @START = @START+1 end FETCH NEXT FROM Cursor_Name INTO @ID,@END end
CLOSE光标名称
取消分配Cursor_Name
从NewTable中选择*