SQL - 重复从表中选择N列

时间:2016-11-18 06:29:28

标签: sql-server

我需要从tableA中选择前N列并插入另一个tableB。这需要完成,直到tableA中的所有列都移到tableB。

实施例,

tableA:    
         A1,A2,B1,B2,C1,C2   
         10,10,20,20,30,30  
          11,11,22,22,33,33

转换为这样的

tableB -     
         X, Y   
         10,10   
         11,11  
         20,20  
         22,22  
         30,30                 
         33,33  

我可以使用union获得此输出,如下所示

insert into tableB  
select A1,A2 from tableA  
UNION  
select B1,B2 from tableA  
UNION  
select C1,C2 from tableA  

但我想知道最好和最优化的方式。

1 个答案:

答案 0 :(得分:3)

SELECT
      cj.x, cj.y
FROM table1 t
CROSS APPLY (
        VALUES
            (t.a1, t.a2)
          , (t.b1, t.b2)
          , (t.c1, t.c2)
         ) AS cj (x, y)

使用带有值的交叉应用允许您为每个输入行生成多个输出行。只需为每个输出行布置列对,如上所示。这会将源表上的扫描次数减少到1。

你需要认识到数据类型需要在x和y的新列位置兼容(例如a1作为日期,b1作为字符串,c1作为十进制全部进入单个x列将失败)。

有关使用CROSS APPLY和VALUES作为UNPIVOT的更多信息,我推荐Brad Schultz的Spotlight on UNPIVOT, Part 1