昨天工作需要生成了200多W行的数据,其实就是递增生成的,前面的文章有写过。这次范围不是连续的,比如电话号码段,可能是12340000-12350000,另一个范围就是22340000-22349999。一共200多个段,很2B的做法,手动分开连续的和不连续,然后使用之前的语句生成号码。我不会告诉你,我就是用这2B的做法的;但我可以告诉你后面有更2B的。
一共放了70多个excel工作表。结果要放到三个工作表里。只好在数据库中union all起来,再copy到excel工作表里,但excel一个工作表又不能放下200多W行,最多大概是104W多,这就是前面为什么要放三个工作表里的原因。
那如何用SQL生成分三部分呢?select top,是的!top只是放第一个工作表,第二第三呢?
SourceTable就一个字段,字段1
第一个语句:select top 1000000 * from SourceTable;
第二个语句:
select top 2000000 * from SourceTable
except
select top 1000000 * from SourceTable
这个语句正确吗?“堆数据表是没有聚集索引的表。即数据行不按任何特殊的顺序存储,数据页也没有任何特殊的顺序”。改为下面的:
select * from
(select top 2000000 * from SourceTable order by 1)
except
select * from
(select top 1000000 * from SourceTable order by 1)
第三个语句:
select * from
(select top 总行数 * from SourceTable order by 1)
except
select * from
(select top 2000000 * from SourceTable order by 1)
是不是很2啊,期间我还试过更2的,分享出来
select * from (select * from SourceTable order by 1)
幸好这个语句有报错,再重看那语句,自己都笑了。
正是因为这里用到except,所以上一篇才写except的去不去重复的问题。
关于从某表中取中间某些行的话题先放下;在返回到生成电话号码那话题
生成号码都可以用循环,有多少号码段为毛不能用循环啊?
1.把号码段导入数据库,HD;添加序号
select ROW_NUMBER() over (order by 号段) as xuhao, 号段 into HDU from HD;
2.循环中嵌套循环就OK了
declare @n numeric(8,0); declare @i int; set @i=1; while (@i<=5) begin set @n = (select cast(号段+‘0000‘ as numeric) from hdU where xuhao=@i); while (@n <= (select cast(号段+‘9999‘ as numeric) from hdU where xuhao=@i)) begin insert into Haoma select @n set @n = @n+1 end set @i=@i+1 end go 试了5个号段是没问题的。
就加一个xuhao的字段就方便多了,干嘛不用identity?非得用ROW_NUMBER()?
思维啊,这些天老是想窗口函数了。其实identity也是可以的。
今天和老大说关于取表中间行的问题,老大直接来了句,你加个id的字段就好了。对啊,取前多少行和中间多少行,在where条件里判断ID的范围就好了。恍然大悟啊,上面的identity替换窗口函数也是受这个影响。
思维啊!!!
原文:http://www.cnblogs.com/cnmarkao/p/3770335.html