在一个SQL语句中插入不同值的重复项

时间:2015-01-24 01:31:23

标签: sql sql-server insert

以下是INSERT语句示例:

INSERT INTO 
    Foo (c1,c2)
VALUES
    (a,1)
    ,(b,2)
    ,(c,3)

如何在没有冗余插入语句的情况下插入这些值以显示以下结果?:

c1 | c2
-------
a  |1
a  |1
a  |1
a  |1
a  |1
a  |1
b  |2
b  |2
b  |2
b  |2
b  |2
b  |2
c  |3
c  |3
c  |3
c  |3
c  |3
c  |3

3 个答案:

答案 0 :(得分:1)

插入这些值后,使用Recursive CTE执行此操作

;with cte as
(
select c1,c2,1 as id from foo
union all
select c1,c2,id+1 from cte where id<5
)
Insert into Foo (c1,c2)
select c1,c2 from cte

或使用Cross Join表格进行numbers。如果您没有numbers表使用master.dbo.spt_values

Insert into Foo(c1,c2)
SELECT c1, c2
FROM Foo
CROSS JOIN (SELECT number
            FROM master.dbo.spt_values
            WHERE type = 'P'
            AND number BETWEEN 1 AND 5) T

答案 1 :(得分:1)

您可以使用动态sql复制插入x次:

declare @sql nvarchar(max)
select @sql = replicate('
INSERT INTO 
    Foo (c1,c2)
VALUES
    (''a'',1)
    ,(''b'',2)
    ,(''c'',3)',6)

exec(@sql)

select * from Foo order by c1,c2

或者,您可以循环,直到您拥有所需的插入数量:

while (select count(*) from Foo where c1 = 'a') < 6
    begin
        INSERT INTO 
            Foo (c1,c2)
        VALUES
            ('a',1)
            ,('b',2)
            ,('c',3)
    end

select * from Foo order by c1,c2

另一种选择是:

INSERT INTO 
    Foo (c1,c2)
        VALUES
            ('a',1)
            ,('b',2)
            ,('c',3)
GO 6

答案 2 :(得分:0)

设计不可能!两列是不够的。您需要一个子表或第三列来保存您的“计数”。 “a”,“b”,“c”的行数不能通过两列推断,也不能小于每行的实际行数。

相关问题