我需要从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
但我想知道最好和最优化的方式。
答案 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