使用除一列之外的重复数据填充sql表

时间:2013-09-16 22:51:31

标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2

我有一个sql表:

级别

LevelId Min Product
1       x    1
2       y    1
3       z    1
4       a    1

我需要通过仅更改1 2,3 .... 40

中的产品ID将相同的数据复制到数据库中

示例

 LevelId Min Product
    1       x    2
    2       y    2
    3       z    2
    4       a    2

我可以做类似

的事情

INSERT INTO dbo.Levels SELECT top 4 * fROM dbo.Levels 但那只会复制粘贴数据。 有没有办法可以复制数据并粘贴它只更改产品值?

4 个答案:

答案 0 :(得分:2)

你大部分都在那里 - 你只需要采取一个更合乎逻辑的步骤:

INSERT INTO dbo.Levels (LevelID, Min, Product)
    SELECT LevelID, Min, 2 FROM dbo.Levels WHERE Product = 1

...将使用不同的产品ID复制您的行。

还要考虑WHERE Product = 1TOP 4更可靠。如果表格中有超过四行,您将无法保证TOP 4将返回相同的四行,除非您还在选择中添加了ORDER BY,但是WHERE Product = ...将始终返回相同的行,并且即使您添加产品ID为1的额外行,也会继续工作(因为您必须考虑将TOP 4更改为TOP 5,依此类推如果添加额外的行)。

答案 1 :(得分:1)

您可以生成产品ID,然后将其加载到:

with cte as (
      select 2 as n
      union all
      select n + 1
      from cte
      where n < 40
     )
INSERT INTO dbo.Levels(`min`, product)
    SELECT `min`, cte.n as product
    fROM dbo.Levels l cross join
         cte
    where l.productId = 1;

这假设LevelId是一个标识列,在插入时自动递增。如果不是:

with cte as (
      select 2 as n
      union all
      select n + 1
      from cte
      where n < 40
     )
INSERT INTO dbo.Levels(levelid, `min`, product)
    SELECT l.levelid+(cte.n-1)*4, `min`, cte.n as product
    fROM dbo.Levels l cross join
         cte
    where l.productId = 1;

答案 2 :(得分:0)

INSERT INTO dbo.Levels (LevelId, Min, Product)
SELECT TOP 4
    LevelId,
    Min,
    2
FROM dbo.Levels

您可以在SELECT语句中包含表达式,包括硬编码值或Product + 1或其他任何内容。

我希望你可能不想插入LevelId,但留下那里匹配你的样本。如果您不希望它只是从INSERTSELECT部分删除它。

答案 3 :(得分:0)

例如,您可以对数字表使用CROSS JOIN

WITH
  L0   AS(SELECT 1 AS C UNION ALL SELECT 1 AS O), -- 2 rows
  L1   AS(SELECT 1 AS C FROM L0 AS A CROSS JOIN L0 AS B), -- 4 rows
  Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS N FROM L1)
SELECT
  lvl.[LevelID],
  lvl.[Min],
  num.[N]
FROM dbo.[Levels] lvl
CROSS JOIN Nums num

这会重复4次。

相关问题