为0和<value>之间的每个整数插入行,不带游标</value>

时间:2014-06-03 13:11:49

标签: sql-server tsql

我有一个带有id和count的源表。

id count
a     5
b     2
c     31

我需要填充一个目标表,每个整数最多为每个id的计数。

id value
a     1
a     2
a     3
a     4
a     5
b     1
b     2
c     1
c     2
etc...

我目前的解决方案是这样的:

INSERT INTO destination (id,value)
    source.id
    sequence.number
FROM 
(VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9)) AS sequence(number)
INNER JOIN 
source ON sequence.number <= source.count

该解决方案具有上限并且是平坦的跛脚。无论如何用一组全部整数替换序列?或者另一种不使用循环的解决方案。

3 个答案:

答案 0 :(得分:0)

不幸的是,SQL Server中没有所有整数集。但是,使用一点技巧,您可以轻松生成这样的集合:

select N from (
    select ROW_NUMBER() OVER (ORDER BY t1.object_id) AS N 
    from sys.all_objects t1, sys.all_objects t2
) AS numbers
where N between 1 and 1000000

将生成一组从1到1000000的所有数字。如果需要超过几百万个数字,请第三次将sys.all_objects添加到交叉连接。

答案 1 :(得分:0)

这应该有效:

 WITH r AS (
    SELECT id, count, 1 AS n FROM SourceTable
    UNION ALL
    SELECT id, count, n+1 FROM r WHERE n<count
)
SELECT id,n FROM r
order by id,n
OPTION (MAXRECURSION 0)

答案 2 :(得分:0)

您可以在此页面中找到许多示例:

DECLARE @table TABLE (ID VARCHAR(1), counter INT)

INSERT INTO @table SELECT 'a', 5
INSERT INTO @table SELECT 'b', 3
INSERT INTO @table SELECT 'c', 31



;WITH cte (ID, counter) AS (

    SELECT id, 1
    FROM @table 
    UNION ALL
    SELECT c.id, c.counter +1
    FROM cte AS c
    INNER JOIN @table AS t
        ON t.id = c.id
    WHERE c.counter + 1 <= t.counter

)
SELECT *
FROM cte
ORDER BY ID, Counter