1

例如,我有第一个表,我想使用第一个表填充第二个表。

           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”编写第三行,但我完全不知道如何插入第四行。

我知道我可以简单地为 A、B、C 和 D 中的每一个编写 4 个插入命令,但是我将按以下顺序获得非代码,这是不需要的:

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 by在 select 中使用 right 子句并按以下方式排序来获得所需的任何顺序:

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 回答