基本上,我有一个表T
,其中包含以下信息
Col1 | Col2 | Factor
A B 50
C D 60
我现在需要在T
的n行中插入基于Factor
的每行重复项。在第一行中,我将具有以下内容:
B | string | 1
(50x)
(其中string
是硬编码的字符串)
我该怎么办?
答案 0 :(得分:3)
使用递归CTE的简单方法:
with cte as (
select col1, col2, factor, 1 as lev
from t
union all
select col1, col2, factor - 1, lev + 1
from cte
where factor > 1
)
select col1, col2, 1 as factor -- or perhaps lev if you want an incrementing value
from cte;
两个注意事项:
insert
或select into
。factor
可以大于100,则将option (maxrecursion 0)
添加到查询中。递归CTE的性能令人惊讶。但是,如果您需要生成不计其数的行,则某种类型的数字/计数表将很有用。例如,如果您的基表有足够的行:
select col1, col2, 1 as factor
from t join
(select row_number() over (order by (select null)) as n
from t
) n
on n.n <= t.factor
答案 1 :(得分:1)
这里是source中的另一个选项:
Create table FactorTable (Col1 char(1)
, Col2 char(1)
, Factor int)
Insert into FactorTable Values
('A', 'B', 50),
('C', 'D', 60)
SELECT *
FROM FactorTable t
CROSS APPLY (SELECT n
FROM (SELECT ROW_NUMBER() OVER(ORDER BY 1/0) AS n
FROM master..spt_values s1) AS sub
WHERE sub.n <= t.Factor) AS s2(Series);
实时db<>fiddle演示。