我有一个带有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
该解决方案具有上限并且是平坦的跛脚。无论如何用一组全部整数替换序列?或者另一种不使用循环的解决方案。
答案 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