根据选择值插入N行

时间:2020-04-13 13:46:32

标签: sql sql-server

基本上,我有一个表T,其中包含以下信息

Col1 | Col2 | Factor
A      B      50
C      D      60

我现在需要在T的n行中插入基于Factor的每行重复项。在第一行中,我将具有以下内容:

B | string | 1(50x) (其中string是硬编码的字符串)

我该怎么办?

2 个答案:

答案 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;

两个注意事项:

  • 您可以将其用于insertselect 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演示。

相关问题