从现有行创建表中的多行?

时间:2014-12-02 20:00:19

标签: sql-server join insert

使用SQL,我有一个表,其中包含由前三列组成的键。所有列都是小的int值。每行总共有21列。

我想为每个现有密钥插入80个新密钥。例如,第一个键是1 201 0.我想现在更新表还有键1 201 1,120 2,1 1 3,...并保持原始行中存在的值相同,重复原始行除了新的键结构。

我可以用程序执行此操作(读取表然后在循环中执行插入操作),但我想知道如何将其作为SQL语句执行。

2 个答案:

答案 0 :(得分:1)

如果您至少使用SQL Server 2008,则可以使用CROSS APPLY运算符。这样做的任务:

DECLARE @T1 AS TABLE (ID INT)
DECLARE @T2 AS TABLE (ID1 INT, ID2 INT, ID3 INT)

INSERT INTO @T1 VALUES (1),   (2),  (3),  (4),  (5),  (6),  (7),  (8),  (9), (10),
                       (11), (12), (13), (14), (15), (16), (17), (18), (19), (20),
                       (21), (22), (23), (24), (25), (26), (27), (28), (29), (30),
                       (31), (32), (33), (34), (35), (36), (37), (38), (39), (40),
                       (41), (42), (43), (44), (45), (46), (47), (48), (49), (50),
                       (51), (52), (53), (54), (55), (56), (57), (58), (59), (60),
                       (61), (62), (63), (64), (65), (66), (67), (68), (69), (70),
                       (71), (72), (73), (74), (75), (76), (77), (78), (79), (80)

INSERT INTO @T2 VALUES (1, 201, 0)

INSERT INTO @T2
SELECT ID1, ID2, ID3 + T1.ID
FROM @T2 AS T2
CROSS APPLY (SELECT ID
             FROM @T1) AS T1

只需更换" @ T2"与你的桌子,当然,在" @ T2"

中注释插入

希望这有帮助。

干杯

答案 1 :(得分:0)

此外,如果您使用的是SQL Server 2008,则可以使用ROW_NUMBER()。

Insert Into [Table]
( 
   [Key1]
  ,[Key2]
  ,[Key3]
  ,[DataColumn1]
  ,[DataColumn2]
)
(
SELECT 
   [Key1] + CAST( ROW_NUMBER() OVER (ORDER BY [Key1], [Key2], [Key3]) as int)
  ,[Key2] + CAST( ROW_NUMBER() OVER (ORDER BY [Key1], [Key2], [Key3]) as int)
  ,[Key3] + CAST( ROW_NUMBER() OVER (ORDER BY [Key1], [Key2], [Key3]) as int)
  ,[DataColumn1]
  ,[DataColumn2]
FROM [Table]
)

这将插入表中的所有行,按3个键列排序,并将其行值添加到每个单独的键列。我不确切知道您的数据是什么样的,但是这种查询可能会在您的3个密钥上产生冲突。您可以使用大于Max(Key)的值为每个ROW_NUMBER CAST设定种子。你只需要对Seed Value有创意。

Insert Into [Table]
( 
   [Key1]
  ,[Key2]
  ,[Key3]
  ,[DataColumn1]
  ,[DataColumn2]
)
(
SELECT 
   [Key1] + CAST( ROW_NUMBER() OVER (ORDER BY [Key1], [Key2], [Key3]) as int) + SeedValue
  ,[Key2] + CAST( ROW_NUMBER() OVER (ORDER BY [Key1], [Key2], [Key3]) as int) + SeedValue
  ,[Key3] + CAST( ROW_NUMBER() OVER (ORDER BY [Key1], [Key2], [Key3]) as int) + SeedValue
  ,[DataColumn1]
  ,[DataColumn2]
FROM [Table]
)

如果您希望对要复制的行更具选择性,可以在第二个select语句中使用where子句:

Insert Into [Table]
( 
   [Key1]
  ,[Key2]
  ,[Key3]
  ,[DataColumn1]
  ,[DataColumn2]
)
(
SELECT 
   [Key1] + CAST( ROW_NUMBER() OVER (ORDER BY [Key1], [Key2], [Key3]) as int) + SeedValue
  ,[Key2] + CAST( ROW_NUMBER() OVER (ORDER BY [Key1], [Key2], [Key3]) as int) + SeedValue
  ,[Key3] + CAST( ROW_NUMBER() OVER (ORDER BY [Key1], [Key2], [Key3]) as int) + SeedValue
  ,[DataColumn1]
  ,[DataColumn2]
FROM [Table] Where Key1=Something and Key2=Something
)