2

私はSQLテーブルを持っています:

レベル

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

製品 ID のみを 1 から 2,3.... 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 に答える 4

4

ほとんどの道のりです - もう 1 つ論理的な手順を実行する必要があります。

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

...別の製品 ID で行が複製されます。

また、WHERE Product = 1よりも信頼性が高くなると考えてTOP 4ください。テーブルに 4 行を超えると、select にTOP 4も追加しない限り、同じ 4 行が返されるとは限りませんが、常に同じ行が返され、次の場合でも引き続き機能します。商品 ID が 1 の追加の行を追加します (追加の行が追加された場合は、への変更などを検討する必要があります)。ORDER BYWHERE Product = ...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これは、挿入時に自動インクリメントする ID 列であると想定しています。そうでない場合:

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

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 回複製されます。

于 2013-09-17T00:59:37.863 に答える
0
INSERT INTO dbo.Levels (LevelId, Min, Product)
SELECT TOP 4
    LevelId,
    Min,
    2
FROM dbo.Levels

SELECTステートメントには、ハードコードされた値などの式を含めることができProduct + 1ます。

ただし、おそらく LevelId を挿入したくないと思いますが、サンプルと一致するようにそのままにしておきます。したくない場合は、セクションINSERTSELECTセクションから削除してください。

于 2013-09-16T22:57:00.587 に答える