在一个 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 Join
和 numbers
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
以下是 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 Join
和 numbers
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