2

我有一个 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

4 回答 4

4

您已经完成了大部分工作 - 您只需要再采取一个合乎逻辑的步骤:

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

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

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

于 2013-09-16T22:57:08.677 回答
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;
于 2013-09-17T03:44:32.427 回答
0
INSERT INTO dbo.Levels (LevelId, Min, Product)
SELECT TOP 4
    LevelId,
    Min,
    2
FROM dbo.Levels

您可以在SELECT语句中包含表达式,可以是硬编码的值,也可以是类似的东西Product + 1或其他任何东西。

我希望您可能不想插入 LevelId,而是将其留在那里以匹配您的示例。如果您不想这样做,只需将其从INSERTandSELECT部分中删除。

于 2013-09-16T22:57:00.587 回答
0

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

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 次。

于 2013-09-17T00:59:37.863 回答