用重复数据填充一个SQL表,除了一列之外

3
我有一个SQL表:

Levels

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

我需要通过仅更改产品ID从1到40来将相同的数据复制到数据库中。
例如:
 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个回答

4
您已经完成了大部分工作,您只需要再进行一个逻辑步骤即可:
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
你可以生成产品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;

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

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

我猜您可能不想插入 LevelId,但是为了匹配您的示例而将其保留在那里。如果您不想要它,只需从 INSERTSELECT 部分中将其删除即可。


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

这将会复制四次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接