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

Insert Duplicates Of Distinct Value In One SQL Statement

以下是 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

插入这些值后使用 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 Joinnumbers table。如果你没有 numbers table 使用 master.dbo.spt_values table

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

不可能的设计!两列是不够的。您需要 child table 或第三列来容纳您的 "count"。 "a"、"b"、"c"的行数无法通过两列推断出来,且小于每列的实际行数。

您可以使用动态 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