我找不到任何可以解决这个问题的事情,尽管我发现很多事情似乎指向了正确的方向。
我有一张包含约470万条记录的表格。该表还有~319列。在所有这些~319列中,有16个我感兴趣,我想将它们放入另一个只有2列的表中。现在基本上如何设置是“A”列只是一个ID而列1-15是代码。没有列被分组(不确定是否重要)。
我尝试过这样的事情:
Insert Into NewTable(ID,Profession)
Select ID, ProCode1 From OriginalTable WHERE ProCode1 > ''
UNION
Select ID, ProCode2 From OriginalTable WHERE ProCode2 > ''
等等。这根本没有做任何事情,我放了大约20分钟。
现在我可以得到一个小结果但是放弃联合并使用 TOP (1000)
语句,但是即使这样也永远不会有效。
所以问题是如何才能做到这一点:
ID|PID|blah|blah|blah|...|ProCode1|ProCode2|ProCode3|...|ProCode15|blah|...
成:
ID|PID|ProCode|
所有~470万行而不运行:
Insert Into NewTable(PID,ProCode)
select PID, ProCode1 FROM OriginalTable WHERE ProCode1 > ''
Insert Into NewTable(PID, ProCode)
select PID, ProCode2 FROM Original Table WHERE ProCode2 > ''
Insert Into New Table(PID, ProCode)
Select PID, ProCode3 FROM Original Table WHERE ProCode3 > ''
...
...
...
编辑:我忘了ProCodeX
的大多数列都是空白的。所有ProCode1
行都被占用,但每次增加的指数都会小于指数(例如ProCode2
<50%占用,ProCode3
<10%占用
答案 0 :(得分:0)
使用Cross Apply
与Table valued constructor
联系以取消数据取消,而不是使用不同的UNION ALL
Insert Into NewTable(PID,ProCode)
select PID, ProCode FROM OriginalTable
Cross apply
(
values(ProCode1),(ProCode2),(ProCode3),..(ProCode15)
)
cs (ProCode)
Where ProCode <> ''
这将比UNION ALL
查询快得多,因为这将执行单个物理表命中。