1

たとえば、最初のテーブルがあり、最初のテーブルを使用して 2 番目のテーブルを埋めたいとします。

           Table A              
 Name   A    B   C   D
-----------------------
 name1  a1  b1  c1  d1
 name2  a2  b2  c2  d2



      Table B (Desired Format)      
  ID    Name    Code
 ----------------------
  1     name1   a1
  2     name1   b1
  3     name1   c1
  4     name1   d1
  5     name2   a2
  6     name2   b2
  7     name2   c2
  8     name2   d2  

@Surendra Nath GMの提案に従って、私はこれを試しました

   DECLARE @counter as int
   SET @counter = 1;
  ;WITH Actual AS 
  (
  SELECT ROW_NUMBER() OVER( ORDER BY IDKEY) as ID  FROM Northwind.dbo.Table1
  WHERE 
   ),FIRST AS
  (
  SELECT ((ROW_NUMBER() OVER( ORDER BY IDKEY))*4-3) AS ID,Name, A 
  FROM Northwind.dbo.Table1

   ),SECOND AS
  (
   SELECT ((ROW_NUMBER() OVER( ORDER BY IDKEY))*4-2) AS ID, Name ,B
  from Northwind.dbo.Table1
   ), NEXT AS
  (
 SELECT ((ROW_NUMBER() OVER( ORDER BY IDKEY))*4-1) AS ID, Name, C
  from Northwind.dbo.Table1next
 ), ________ as
 (
  SELECT ((ROW_NUMBER() OVER( ORDER BY IDKEY))*4) AS ID, Name, D
from Northwind.dbo.Table1
 )

 @counter = @counter+1;
  )
  SELECT * FROM FIRST
  UNION ALL
  SELECT * FROM SECOND
  UNION ALL
  SELECT * FROM NEXT
  UNION ALL
  SELECT * FROM _________
  ORDER BY ID

ここで、「SECOND AS」の後に何を使用しますか。「THIRD AS」と書いてみましたが、どうやらそのようなコマンドは存在しないので、検索した後、「NEXT AS」を使用して3行目を書くことができましたが、4行目を挿入する方法についてはまったくわかりません。

A、B、C、D のそれぞれに対して 4 つの挿入コマンドを簡単に記述できることはわかっていますが、次の順序で not コードを取得することは望ましくありません。

Table B(NOT DESIRED IN THIS FORMAT)     
  ID    Name    Code
 ----------------------
  1     name1   a1
  2     name2   a2
  3     name1   b1
  4     name2   b2
  5     name1   c1
  6     name2   c2
  7     name1   d1
  8     name2   d2  

また、単純なループを使用して目的の形式を実現できますが、私が取り組んでいるプロジェクトでは、約 200000 行あり、単純なループ メソッドには多くの時間がかかります。だから、CTEを使ってやりたい。助けてください。

4

2 に答える 2

1
insert  TableB
        (ID, Name, Code)
select  row_number() over (order by Name, Code)
,       Name
,       Code
from    (
        select  Name
        ,       A as Code
        from    TableA
        union all
        select  Name
        ,       B
        from    TableA
        union all
        select  Name
        ,       C
        from    TableA
        union all
        select  Name
        ,       D
        from    TableA
        ) SubQueryAlias
于 2013-07-01T13:26:26.397 に答える
1

Unpivotおそらくこれを行うための最速の(最高のパフォーマンスの)方法です:

insert into b(id, name, code)
    select row_number() over (order by (select NULL)) as id, name, code
    from t
    unpivot (code for col in (A, B, C, D)) unpvt;

idこれはを使用して計算しrow_number()ます。identityテーブルを定義するときに、代わりにこの列を列として設定することをお勧めします。

編集:

これは、ID 番号が正しい順序であることを保証するものではありません。それらが正しい順序であれば、それは偶然です。order byselect で正しい節を使用して、それによって順序付けすることで、必要な順序を取得できます。

insert into b(id, name, code)
    select row_number() over (order by (select name, col)) as id, name, code
    from t
    unpivot (code for col in (A, B, C, D)) unpvt;

名前以外の各行に、名前よりも優れた別のキーがある場合があります。これにより、列もアルファベット順に並べられます。

于 2013-07-01T13:33:59.913 に答える