以下是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
答案 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”的行数不能通过两列推断,也不能小于每行的实际行数。